POST /索引名/_bulk
{ "index" : { "_index" : "my_index", "_id" : "1" } }
{ "field1" : "value1" }
{ "index" : { "_index" : "my_index", "_id" : "2" } }
{ "field1" : "value2" }
{ "delete" : { "_index" : "my_index", "_id" : "3" } }
Term 查询用于在指定字段中查找精确匹配指定项的文档,不进行分词处理。它适用于关键字字段、标识符字段等。示例:
GET /index_name/_search
{
"query": {
"term": {
"field_name": "search_term"
}
}
}
Exists 查询用于查找具有指定字段存在的文档。它不关心字段的具体值,只关注字段是否存在。示例:
GET /index_name/_search
{
"query": {
"exists": {
"field": "field_name"
}
}
}
Prefix 查询用于查找指定字段以指定前缀开头的文档。它可以用于模糊匹配、自动补全等场景。示例:
GET /index_name/_search
{
"query": {
"prefix": {
"field_name": {
"value": "prefix"
}
}
}
}
Wildcard 查询使用通配符模式匹配指定字段的值。它支持 “*” 通配符匹配任意字符序列和 “?” 通配符匹配单个字符。示例:
GET /index_name/_search
{
"query": {
"wildcard": {
"field_name": {
"value": "fu*k"
}
}
}
}
Regexp 查询使用正则表达式模式匹配指定字段的值。它可以进行更灵活的模式匹配,但也更消耗资源。示例:
GET /index_name/_search
{
"query": {
"regexp": {
"field_name": "fu.*k"
}
}
}
Ids 查询用于查找具有指定文档ID的文档。它可以一次查询多个文档。示例:
GET /index_name/_search
{
"query": {
"ids": {
"values": ["id1", "id2"]
}
}
}
在 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” 之间(不包括边界值)的文档。
注意:范围查询对于大型索引和高基数字段可能会产生较高的计算成本。在使用时,建议使用适当的索引优化和查询性能调优策略。
在 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" } }
]
}
}
}
在上述示例中,布尔查询由四个不同的子句组成:
通过灵活组合这些子句,您可以根据实际需求构建复杂的查询逻辑,并获取满足条件的文档。布尔查询提供了强大的搜索能力,使您能够更精确地控制和过滤搜索结果。
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” 子句匹配成功,将不会返回结果。
在 Elasticsearch 中,可以使用排序查询(Sort Query)来对搜索结果进行排序。通过指定字段和排序顺序,您可以按照特定的排序规则对文档进行排序。
以下是一些常见的排序查询示例:
GET /index_name/_search
{
"query": {
"match_all": {}
},
"sort": [
{ "field1": { "order": "asc" } },
{ "field2": { "order": "desc" } }
]
}
上述示例表示首先按照字段 “field1” 进行升序排序,然后在 “field1” 相同的情况下,按照字段 “field2” 进行降序排序。
在 Elasticsearch 中,聚合是一种用于对搜索结果进行分析和汇总的功能。
指标聚合用于计算一些数值型的指标,例如总和、平均值、最大值、最小值等。
桶聚合用于将文档分组到不同的桶(buckets)中,每个桶代表一个满足特定条件的子集。桶聚合可以根据字段的值、日期范围等进行分组。
GET /index_name/_search
{
"aggs": {
"total_sum": {
"sum": {
"field": "numeric_field"
}
}
}
}
以上示例将对字段 “numeric_field” 进行求和聚合,返回该字段所有文档的数值总和。
GET /index_name/_search
{
"aggs": {
"avg_value": {
"avg": {
"field": "numeric_field"
}
}
}
}
以上示例将对字段 “numeric_field” 进行平均值聚合,返回该字段所有文档的数值平均值。
Value Count 聚合用于计算指定字段的文档数目,不考虑字段的具体值,只统计文档的数量。
GET /index_name/_search
{
"aggs": {
"count_field": {
"value_count": {
"field": "field_name"
}
}
}
}
Cardinality 聚合用于计算指定字段的唯一值数量,即该字段的基数(cardinality)。这个聚合在计算高基数字段的唯一值数量时非常有用。
GET /index_name/_search
{
"aggs": {
"unique_values": {
"cardinality": {
"field": "field_name"
}
}
}
}
Stats 聚合用于计算指定字段的一些基本统计信息,包括最小值、最大值、平均值、总和和文档数量。
GET /index_name/_search
{
"aggs": {
"stats_field": {
"stats": {
"field": "numeric_field"
}
}
}
}
Extended Stats 聚合是 Stats 聚合的扩展版本,除了 Stats 聚合提供的基本统计信息外,还提供标准差和方差。
GET /index_name/_search
{
"aggs": {
"extended_stats_field": {
"extended_stats": {
"field": "numeric_field"
}
}
}
}
Percentiles 聚合用于计算指定字段的百分位数,可以指定一组百分位数值来计算对应百分位的值。
GET /index_name/_search
{
"aggs": {
"percentiles_field": {
"percentiles": {
"field": "numeric_field",
"percents": [25, 50, 75]
}
}
}
}
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” 的值将文档分组到不同的价格范围内,并返回每个价格范围的桶。
GET /index_name/_search
{
"aggs": {
"group_by_date": {
"date_histogram": {
"field": "date_field",
"format": "MM",
"calendar_interval": "month"
}
}
}
}
以上示例将根据日期字段 “date_field” 进行日期直方图聚合,将文档按照月份进行分组。
在 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 查询是一种强大的查询方式,但同时也有一些安全性和性能方面的考虑。在使用时,建议谨慎处理用户输入的查询字符串,避免潜在的安全风险。同时,复杂的查询语法可能会影响性能,特别是在大型索引中进行全文搜索时,请合理使用查询语法以提高查询效率。