(九)ElasticSearch 搜索/聚合查询/query_string

1.Bulk 批量导入

POST /索引名/_bulk
{
    
     "index" : {
    
     "_index" : "my_index", "_id" : "1" } }
{
    
     "field1" : "value1" }
{
    
     "index" : {
    
     "_index" : "my_index", "_id" : "2" } }
{
    
     "field1" : "value2" }
{
    
     "delete" : {
    
     "_index" : "my_index", "_id" : "3" } }

2.term多种查询

Term Query(词项查询):

Term 查询用于在指定字段中查找精确匹配指定项的文档,不进行分词处理。它适用于关键字字段、标识符字段等。示例:

GET /index_name/_search
{
    
    
  "query": {
    
    
    "term": {
    
    
      "field_name": "search_term"
    }
  }
}

Exists Query(存在查询):

Exists 查询用于查找具有指定字段存在的文档。它不关心字段的具体值,只关注字段是否存在。示例:

GET /index_name/_search
{
    
    
  "query": {
    
    
    "exists": {
    
    
      "field": "field_name"
    }
  }
}

Prefix Query(前缀查询):

Prefix 查询用于查找指定字段以指定前缀开头的文档。它可以用于模糊匹配、自动补全等场景。示例:

GET /index_name/_search
{
    
    
  "query": {
    
    
    "prefix": {
    
    
      "field_name": {
    
    
        "value": "prefix"
      }
    }
  }
}

Wildcard Query(通配符查询):

Wildcard 查询使用通配符模式匹配指定字段的值。它支持 “*” 通配符匹配任意字符序列和 “?” 通配符匹配单个字符。示例:

GET /index_name/_search
{
    
    
  "query": {
    
    
    "wildcard": {
    
    
      "field_name": {
    
    
        "value": "fu*k"

      }
    }
  }
}

Regexp Query(正则表达式查询):

Regexp 查询使用正则表达式模式匹配指定字段的值。它可以进行更灵活的模式匹配,但也更消耗资源。示例:

GET /index_name/_search
{
    
    
  "query": {
    
    
    "regexp": {
    
    
      "field_name": "fu.*k"
    }
  }
}

Ids Query(文档ID查询):

Ids 查询用于查找具有指定文档ID的文档。它可以一次查询多个文档。示例:

GET /index_name/_search
{
    
    
  "query": {
    
    
    "ids": {
    
    
      "values": ["id1", "id2"]
    }
  }
}

3.范围查询

在 Elasticsearch 中,范围查询(Range Query)用于查找指定字段的值在某个范围内的文档。您可以使用范围查询来过滤满足特定条件的文档。范围查询支持数字、日期和字符串类型的字段。您可以指定大于(gt)、大于等于(gte)、小于(lt)、小于等于(lte)某个值的范围条件。

数字范围查询:

GET /index_name/_search
{
    
    
  "query": {
    
    
    "range": {
    
    
      "field_name": {
    
    
        "gte": 10,
        "lte": 100
      }
    }
  }
}

上述示例表示在字段 “field_name” 中查找值在 10 到 100 之间(包括边界值)的文档。

日期范围查询:

GET /index_name/_search
{
    
    
  "query": {
    
    
    "range": {
    
    
      "date_field": {
    
    
        "gte": "2021-01-01",
        "lte": "2021-12-31",
        "format": "yyyy-MM-dd"
      }
    }
  }
}

在上述示例中,范围查询应用于日期字段 “date_field”,匹配日期在 2021 年 1 月 1 日到 2021 年 12 月 31 日之间的文档。

字符串范围查询:

GET /index_name/_search
{
    
    
  "query": {
    
    
    "range": {
    
    
      "field_name": {
    
    
        "gte": "A",
        "lt": "M"
      }
    }
  }
}

上述示例表示在字段 “field_name” 中查找值在 “A” 到 “M” 之间(不包括边界值)的文档。

注意:范围查询对于大型索引和高基数字段可能会产生较高的计算成本。在使用时,建议使用适当的索引优化和查询性能调优策略。

4.布尔查询

在 Elasticsearch 中,布尔查询(Boolean Query)用于组合多个查询条件,以实现更复杂和精确的搜索需求。布尔查询可以通过逻辑运算符(AND、OR、NOT)将多个查询条件组合在一起,并根据条件的匹配结果来确定最终的搜索结果。

布尔查询支持以下几种查询子句:

1.Must(与操作):所有的 Must 子句都必须匹配才会返回文档。
2.Must Not(非操作):Must Not 子句中的查询条件必须不匹配才会返回文档。
3.Should(或操作):Should 子句中的查询条件可以有选择地匹配,用于增加相关性和评分。
4.Filter(过滤操作):Filter 子句用于过滤文档,不会对匹配与否进行评分。

以下是一个布尔查询的示例:

GET /index_name/_search
{
    
    
  "query": {
    
    
    "bool": {
    
    
      "must": [
        {
    
     "term": {
    
     "field1": "value1" } },
        {
    
     "range": {
    
     "field2": {
    
     "gte": 10, "lte": 100 } } }
      ],
      "must_not": [
        {
    
     "term": {
    
     "field3": "value2" } }
      ],
      "should": [
        {
    
     "term": {
    
     "field4": "value3" } },
        {
    
     "term": {
    
     "field5": "value4" } }
      ],
      "filter": [
        {
    
     "term": {
    
     "field6": "value5" } }
      ]
    }
  }
}

在上述示例中,布尔查询由四个不同的子句组成:

  • must 子句:要求 “field1” 匹配 “value1” 并且 “field2” 的值在 10 到 100 之间。
  • must_not 子句:要求 “field3” 不匹配 “value2”。
  • should 子句:要求 “field4” 匹配 “value3” 或者 “field5” 匹配 “value4”。
  • filter 子句:要求 “field6” 匹配 “value5”。

通过灵活组合这些子句,您可以根据实际需求构建复杂的查询逻辑,并获取满足条件的文档。布尔查询提供了强大的搜索能力,使您能够更精确地控制和过滤搜索结果。

minimum_should_match :
在 Elasticsearch 的布尔查询中,可以使用 “minimum_should_match” 参数来指定至少匹配多少个 “should” 子句才会返回文档结果。该参数用于控制 OR 组合条件下的最小匹配数。
默认情况下,“minimum_should_match” 参数的值为 1,即至少匹配一个 “should” 子句。
以下是使用 “minimum_should_match” 参数的示例:

GET /index_name/_search
{
    
    
  "query": {
    
    
    "bool": {
    
    
      "should": [
        {
    
     "term": {
    
     "field1": "value1" } },
        {
    
     "term": {
    
     "field2": "value2" } },
        {
    
     "term": {
    
     "field3": "value3" } }
      ],
      "minimum_should_match": 2
    }
  }
}

上述示例中,“minimum_should_match” 参数的值为 2,意味着至少要求匹配两个 “should” 子句才会返回文档结果。如果只有一个 “should” 子句匹配成功,将不会返回结果。

5.排序查询

在 Elasticsearch 中,可以使用排序查询(Sort Query)来对搜索结果进行排序。通过指定字段和排序顺序,您可以按照特定的排序规则对文档进行排序。
以下是一些常见的排序查询示例:

GET /index_name/_search
{
    
    
  "query": {
    
    
    "match_all": {
    
    }
  },
  "sort": [
    {
    
     "field1": {
    
     "order": "asc" } },
    {
    
     "field2": {
    
     "order": "desc" } }
  ]
}

上述示例表示首先按照字段 “field1” 进行升序排序,然后在 “field1” 相同的情况下,按照字段 “field2” 进行降序排序。

6.聚合查询

在 Elasticsearch 中,聚合是一种用于对搜索结果进行分析和汇总的功能。
指标聚合用于计算一些数值型的指标,例如总和、平均值、最大值、最小值等。
桶聚合用于将文档分组到不同的桶(buckets)中,每个桶代表一个满足特定条件的子集。桶聚合可以根据字段的值、日期范围等进行分组。

指标聚合:

Sum Aggregation(求和聚合):

GET /index_name/_search
{
    
    
  "aggs": {
    
    
    "total_sum": {
    
    
      "sum": {
    
    
        "field": "numeric_field"
      }
    }
  }
}

以上示例将对字段 “numeric_field” 进行求和聚合,返回该字段所有文档的数值总和。

Average Aggregation(平均值聚合):

GET /index_name/_search
{
    
    
  "aggs": {
    
    
    "avg_value": {
    
    
      "avg": {
    
    
        "field": "numeric_field"
      }
    }
  }
}

以上示例将对字段 “numeric_field” 进行平均值聚合,返回该字段所有文档的数值平均值。

Value Count Aggregation(值计数聚合):

Value Count 聚合用于计算指定字段的文档数目,不考虑字段的具体值,只统计文档的数量。

GET /index_name/_search
{
    
    
  "aggs": {
    
    
    "count_field": {
    
    
      "value_count": {
    
    
        "field": "field_name"
      }
    }
  }
}

Cardinality Aggregation(基数聚合):

Cardinality 聚合用于计算指定字段的唯一值数量,即该字段的基数(cardinality)。这个聚合在计算高基数字段的唯一值数量时非常有用。
GET /index_name/_search

{
    
    
  "aggs": {
    
    
    "unique_values": {
    
    
      "cardinality": {
    
    
        "field": "field_name"
      }
    }
  }
}

Stats Aggregation(统计聚合):

Stats 聚合用于计算指定字段的一些基本统计信息,包括最小值、最大值、平均值、总和和文档数量。

GET /index_name/_search
{
    
    
  "aggs": {
    
    
    "stats_field": {
    
    
      "stats": {
    
    
        "field": "numeric_field"
      }
    }
  }
}

Extended Stats Aggregation(扩展统计聚合):

Extended Stats 聚合是 Stats 聚合的扩展版本,除了 Stats 聚合提供的基本统计信息外,还提供标准差和方差。

GET /index_name/_search
{
    
    
  "aggs": {
    
    
    "extended_stats_field": {
    
    
      "extended_stats": {
    
    
        "field": "numeric_field"
      }
    }
  }
}

Percentiles Aggregation(百分位数聚合):

Percentiles 聚合用于计算指定字段的百分位数,可以指定一组百分位数值来计算对应百分位的值。

GET /index_name/_search
{
    
    
  "aggs": {
    
    
    "percentiles_field": {
    
    
      "percentiles": {
    
    
        "field": "numeric_field",
        "percents": [25, 50, 75]
      }
    }
  }
}

桶聚合:

Terms Aggregation(词项聚合):

GET /index_name/_search
{
    
    
  "aggs": {
    
    
    "group_by_field": {
    
    
      "terms": {
    
    
        "field": "category_field"
      }
    }
  }
}

以上示例将根据字段 “category_field” 进行词项聚合,将文档分组到不同的桶中,每个桶代表一个不同的类别。

排序聚合:

排序聚合用于对分组聚合结果进行排序,可以按照指定字段的值进行升序或降序排序。

{
    
    
  "aggs": {
    
    
    "group_by_field": {
    
    
      "terms": {
    
    
        "field": "category_field",
        "size": 10,
        "order": {
    
    
          "avg_price": "desc"
        }
      },
      "aggs": {
    
    
        "avg_price": {
    
    
          "avg": {
    
    
            "field": "price"
          }
        }
      }
    }
  }
}

以上示例将按照字段 “category_field” 进行分组,并在每个桶中计算该词项的平均价格,然后按照平均价格降序排序。

筛选分组聚合

POST /nba/_search
{
    
    
 "aggs": {
    
    
	"aggsName": {
    
    
		"terms": {
    
    
			 "field": "teamNameEn",
			 "include": ["A","B"],
			 "exclude": ["C"],
			 "size": 30,
			 "order": {
    
    
			 "avgAge": "desc"
			 }
		 },
		 "aggs": {
    
    
			 "avgAge": {
    
    
				 "avg": {
    
    
				 "field": "age"
				 }
	 		}
   		}
	 }
   }
 }

范围分组聚合:

范围分组聚合用于将字段的值分组到不同的范围内,并返回每个范围的桶。

{
    
    
  "aggs": {
    
    
    "price_ranges": {
    
    
      "range": {
    
    
        "field": "price",
        "ranges": [
          {
    
     "to": 100 },
          {
    
     "from": 100, "to": 500 },
          {
    
     "from": 500 }
        ]
      }
    }
  }
}

以上示例将根据字段 “price” 的值将文档分组到不同的价格范围内,并返回每个价格范围的桶。

Date Histogram Aggregation(日期直方图聚合):

GET /index_name/_search
{
    
    
  "aggs": {
    
    
    "group_by_date": {
    
    
      "date_histogram": {
    
    
        "field": "date_field",
        "format": "MM",
        "calendar_interval": "month"
      }
    }
  }
}

以上示例将根据日期字段 “date_field” 进行日期直方图聚合,将文档按照月份进行分组。

query_string 查询

在 Elasticsearch 中,query_string 查询是一种强大且灵活的查询方式,用于在文本字段中执行复杂的全文搜索。它支持使用 Lucene 查询语法来构建查询字符串,可以实现多字段查询、模糊搜索、布尔逻辑和通配符等功能。

使用 query_string 查询时,您可以在查询字符串中指定需要搜索的文本内容,并使用特定的语法来构建查询条件。以下是一个简单的示例:

{
    
    
  "query": {
    
    
    "query_string": {
    
    
      "query": "search text",
      "default_field": "content"
    }
  }
}

上述示例中,我们使用 query_string 查询来搜索文本字段 “content” 中包含 “search text” 的文档。

query_string 查询支持的一些常见查询语法和操作符包括:

常规搜索:单词之间默认为逻辑与的关系,例如 “search text” 表示搜索同时包含 “search” 和 “text” 的文档。
通配符:支持通配符查询,例如 “te?t” 可以匹配 “test” 和 “text”。
通配符:支持通配符查询,例如 “te?t” 可以匹配 “test” 和 “text”。
布尔操作符:AND、OR、NOT 可以用来组合查询条件,例如 “search AND text” 表示搜索同时包含 “search” 和 “text” 的文档,“search OR text” 表示搜索包含 “search” 或 “text” 的文档。
括号:可以用括号来组合复杂的查询条件,例如 “(search AND text) OR (hello AND world)”。
范围搜索:可以使用 [ 和 ] 来指定范围搜索条件,例如 “price:[10 TO 100]” 表示搜索价格在 10 到 100 之间的文档。
请注意,query_string 查询是一种强大的查询方式,但同时也有一些安全性和性能方面的考虑。在使用时,建议谨慎处理用户输入的查询字符串,避免潜在的安全风险。同时,复杂的查询语法可能会影响性能,特别是在大型索引中进行全文搜索时,请合理使用查询语法以提高查询效率。

猜你喜欢

转载自blog.csdn.net/csdn570566705/article/details/131528270