【ES常用查询操作】
在 Elasticsearch (ES) 中,多条件检索可以通过组合多个查询条件来实现。Elasticsearch 提供了多种查询类型和组合方式,常见的有 bool
查询、must
、should
、must_not
和 filter
等。以下是一些常见的多条件检索示例。
1. 使用 bool
查询
bool
查询允许你组合多个查询条件,并指定它们之间的逻辑关系。
示例:必须匹配 field1
和 field2
,并且可以选择性匹配 field3
{
"query": {
"bool": {
"must": [
{ "match": { "field1": "value1" } },
{ "match": { "field2": "value2" } }
],
"should": [
{ "match": { "field3": "value3" } }
],
"minimum_should_match": 1
}
}
}
在这个示例中,文档必须匹配 field1
和 field2
,并且至少匹配 field3
中的一个条件。
2. 使用 filter
查询
filter
查询用于过滤文档,不计算相关性评分,通常用于结构化数据查询。
示例:必须匹配 field1
和 field2
,并且过滤 field4
{
"query": {
"bool": {
"must": [
{ "match": { "field1": "value1" } },
{ "match": { "field2": "value2" } }
],
"filter": [
{ "term": { "field4": "value4" } }
]
}
}
}
在这个示例中,文档必须匹配 field1
和 field2
,并且 field4
必须等于 value4
。
3. 使用 must_not
查询
must_not
查询用于排除匹配特定条件的文档。
示例:必须匹配 field1
,但不能匹配 field2
{
"query": {
"bool": {
"must": [
{ "match": { "field1": "value1" } }
],
"must_not": [
{ "match": { "field2": "value2" } }
]
}
}
}
在这个示例中,文档必须匹配 field1
,但不能匹配 field2
。
4. 组合查询示例
示例:复杂组合查询
{
"query": {
"bool": {
"must": [
{ "match": { "field1": "value1" } },
{ "range": { "field2": { "gte": 10, "lte": 20 } } }
],
"should": [
{ "match": { "field3": "value3" } },
{ "term": { "field4": "value4" } }
],
"must_not": [
{ "term": { "field5": "value5" } }
],
"filter": [
{ "term": { "field6": "value6" } }
],
"minimum_should_match": 1
}
}
}
在这个示例中:
- 文档必须匹配
field1
和field2
的范围条件。 - 文档应该匹配
field3
或field4
中的一个条件。 - 文档不能匹配
field5
。 - 文档必须匹配
field6
。
5. 使用 multi_match
查询
multi_match
查询允许你在多个字段中搜索相同的关键词。
示例:在 field1
和 field2
中搜索 value
{
"query": {
"multi_match": {
"query": "value",
"fields": ["field1", "field2"]
}
}
}
在这个示例中,Elasticsearch 将在 field1
和 field2
中搜索 value
。
6. 使用 nested
查询
如果你的文档包含嵌套对象,可以使用 nested
查询。
示例:嵌套查询
假设你的文档结构如下:
{
"name": "John",
"address": {
"city": "New York",
"zipcode": "10001"
}
}
你可以使用 nested
查询来检索嵌套对象中的字段。
示例:嵌套查询
{
"query": {
"nested": {
"path": "address",
"query": {
"bool": {
"must": [
{ "match": { "address.city": "New York" } },
{ "match": { "address.zipcode": "10001" } }
]
}
}
}
}
}
在这个示例中,查询将检索 address
对象中的 city
和 zipcode
字段。
7. 使用 terms
查询
terms
查询允许你匹配多个值中的任意一个。
示例:匹配 field1
中的多个值
{
"query": {
"terms": {
"field1": ["value1", "value2", "value3"]
}
}
}
在这个示例中,查询将匹配 field1
中的任意一个值:value1
、value2
或 value3
。
8. 使用 range
查询
range
查询允许你匹配数值、日期或字符串范围。
示例:匹配 field1
的范围
{
"query": {
"range": {
"field1": {
"gte": 10,
"lte": 20
}
}
}
}
在这个示例中,查询将匹配 field1
的值在 10 到 20 之间的文档。
9. 使用 exists
查询
exists
查询用于匹配包含特定字段的文档。
示例:匹配包含 field1
的文档
{
"query": {
"exists": {
"field": "field1"
}
}
}
在这个示例中,查询将匹配所有包含 field1
字段的文档。
10. 使用 wildcard
查询
wildcard
查询允许你使用通配符进行模式匹配。
示例:匹配 field1
中的模式
{
"query": {
"wildcard": {
"field1": "val*"
}
}
}
在这个示例中,查询将匹配 field1
中以 val
开头的所有值。
11. 使用 prefix
查询
prefix
查询用于匹配以特定前缀开头的字段值。
示例:匹配 field1
中的前缀
{
"query": {
"prefix": {
"field1": "val"
}
}
}
在这个示例中,查询将匹配 field1
中以 val
开头的所有值。
12. 使用 fuzzy
查询
fuzzy
查询用于模糊匹配,允许一定程度的拼写错误。
示例:模糊匹配 field1
{
"query": {
"fuzzy": {
"field1": "value"
}
}
}
在这个示例中,查询将模糊匹配 field1
中接近 value
的所有值。
13. 使用 regexp
查询
regexp
查询允许你使用正则表达式进行模式匹配。
示例:正则表达式匹配 field1
{
"query": {
"regexp": {
"field1": "val.*"
}
}
}
在这个示例中,查询将匹配 field1
中符合正则表达式 val.*
的所有值。
14. 使用 script
查询
script
查询允许你使用脚本进行复杂的条件匹配。
示例:使用脚本查询
{
"query": {
"script": {
"script": {
"source": "doc['field1'].value > params.value",
"params": {
"value": 10
}
}
}
}
}
在这个示例中,查询将匹配 field1
的值大于 10 的文档。
15. 使用 match_phrase
查询
match_phrase
查询用于匹配包含特定短语的文档。
示例:匹配 field1
中的短语
{
"query": {
"match_phrase": {
"field1": "quick brown fox"
}
}
}
在这个示例中,查询将匹配 field1
中包含短语 “quick brown fox” 的文档。
16. 使用 match_phrase_prefix
查询
match_phrase_prefix
查询用于匹配以特定短语前缀开头的文档。
示例:匹配 field1
中的短语前缀
{
"query": {
"match_phrase_prefix": {
"field1": "quick brown"
}
}
}
在这个示例中,查询将匹配 field1
中以 “quick brown” 开头的短语。
17. 使用 geo_distance
查询
geo_distance
查询用于匹配在特定地理距离内的文档。
示例:匹配在特定地理距离内的文档
{
"query": {
"geo_distance": {
"distance": "200km",
"location": {
"lat": 40.7128,
"lon": -74.0060
}
}
}
}
在这个示例中,查询将匹配在距离 (40.7128, -74.0060) 200 公里范围内的文档。
18. 使用 geo_bounding_box
查询
geo_bounding_box
查询用于匹配在特定地理边界框内的文档。
示例:匹配在特定地理边界框内的文档
{
"query": {
"geo_bounding_box": {
"location": {
"top_left": {
"lat": 40.73,
"lon": -74.1
},
"bottom_right": {
"lat": 40.01,
"lon": -71.12
}
}
}
}
}
在这个示例中,查询将匹配在指定地理边界框内的文档。
19. 使用 geo_polygon
查询
geo_polygon
查询用于匹配在特定地理多边形内的文档。
示例:匹配在特定地理多边形内的文档
{
"query": {
"geo_polygon": {
"location": {
"points": [
{ "lat": 40.73, "lon": -74.1 },
{ "lat": 40.01, "lon": -71.12 },
{ "lat": 40.73, "lon": -71.12 }
]
}
}
}
}
在这个示例中,查询将匹配在指定地理多边形内的文档。
20. 使用 more_like_this
查询
more_like_this
查询用于查找与给定文档相似的文档。
示例:查找与给定文档相似的文档
{
"query": {
"more_like_this": {
"fields": ["field1", "field2"],
"like": "text to find similar documents",
"min_term_freq": 1,
"max_query_terms": 12
}
}
}
在这个示例中,查询将查找与给定文本相似的文档。
21. 使用 ids
查询
ids
查询用于根据文档 ID 匹配文档。
示例:根据文档 ID 匹配文档
{
"query": {
"ids": {
"values": ["1", "2", "3"]
}
}
}
在这个示例中,查询将匹配 ID 为 1
、2
和 3
的文档。
22. 使用 constant_score
查询
constant_score
查询用于将查询的相关性评分设置为常量值。
示例:将查询的相关性评分设置为常量值
{
"query": {
"constant_score": {
"filter": {
"term": { "field1": "value1" }
},
"boost": 1.2
}
}
}
在这个示例中,查询将匹配 field1
为 value1
的文档,并将相关性评分设置为常量值 1.2
。
23. 使用 function_score
查询
function_score
查询允许你根据特定函数调整文档的相关性评分。
示例:根据特定函数调整相关性评分
{
"query": {
"function_score": {
"query": {
"match": { "field1": "value1" }
},
"functions": [
{
"filter": { "match": { "field2": "value2" } },
"weight": 2
},
{
"filter": { "range": { "field3": { "gte": 10 } } },
"weight": 1.5
}
],
"boost_mode": "multiply"
}
}
}
在这个示例中,查询将首先匹配 field1
为 value1
的文档,然后根据 field2
和 field3
的条件调整相关性评分。
24. 使用 dis_max
查询
dis_max
查询用于组合多个查询,并返回得分最高的文档。
示例:组合多个查询并返回得分最高的文档
{
"query": {
"dis_max": {
"queries": [
{ "match": { "field1": "value1" } },
{ "match": { "field2": "value2" } }
],
"tie_breaker": 0.7
}
}
}
在这个示例中,查询将组合 field1
和 field2
的匹配条件,并返回得分最高的文档。
25. 使用 boosting
查询
boosting
查询用于提升某些查询的得分,同时降低其他查询的得分。
示例:提升和降低特定查询的得分
{
"query": {
"boosting": {
"positive": {
"match": { "field1": "value1" }
},
"negative": {
"match": { "field2": "value2" }
},
"negative_boost": 0.2
}
}
}
在这个示例中,查询将提升 field1
为 value1
的文档的得分,同时降低 field2
为 value2
的文档的得分。
26. 使用 script_score
查询
script_score
查询允许你使用脚本计算文档的相关性评分。
示例:使用脚本计算相关性评分
{
"query": {
"script_score": {
"query": {
"match": { "field1": "value1" }
},
"script": {
"source": "doc['field2'].value * params.factor",
"params": {
"factor": 1.5
}
}
}
}
}
在这个示例中,查询将首先匹配 field1
为 value1
的文档,然后使用脚本计算相关性评分。
27. 使用 highlight
查询
highlight
查询用于在查询结果中高亮显示匹配的部分。
示例:高亮显示匹配的部分
{
"query": {
"match": { "field1": "value1" }
},
"highlight": {
"fields": {
"field1": {}
}
}
}
在这个示例中,查询将匹配 field1
为 value1
的文档,并在结果中高亮显示匹配的部分。
28. 使用 rescore
查询
rescore
查询用于对初始查询结果进行重新评分。
示例:对初始查询结果进行重新评分
{
"query": {
"match": { "field1": "value1" }
},
"rescore": {
"window_size": 50,
"query": {
"rescore_query": {
"match_phrase": { "field1": "value1" }
},
"query_weight": 0.7,
"rescore_query_weight": 1.2
}
}
}
在这个示例中,查询将首先匹配 field1
为 value1
的文档,然后在前 50 个结果中使用 match_phrase
查询进行重新评分。
29. 使用 percolate
查询
percolate
查询用于查找与特定文档匹配的查询。
示例:查找与特定文档匹配的查询
{
"query": {
"percolate": {
"field": "query",
"document": {
"field1": "value1"
}
}
}
}
在这个示例中,查询将查找与文档 {"field1": "value1"}
匹配的查询。
30. 使用 parent_id
查询
parent_id
查询用于查找具有特定父文档 ID 的子文档。
示例:查找具有特定父文档 ID 的子文档
{
"query": {
"parent_id": {
"type": "child_type",
"id": "parent_id_value"
}
}
}
在这个示例中,查询将查找父文档 ID 为 parent_id_value
的子文档。
31. 使用 has_child
查询
has_child
查询用于查找具有特定子文档的父文档。
示例:查找具有特定子文档的父文档
{
"query": {
"has_child": {
"type": "child_type",
"query": {
"match": { "field1": "value1" }
}
}
}
}
在这个示例中,查询将查找具有 field1
为 value1
的子文档的父文档。
32. 使用 has_parent
查询
has_parent
查询用于查找具有特定父文档的子文档。
示例:查找具有特定父文档的子文档
{
"query": {
"has_parent": {
"parent_type": "parent_type",
"query": {
"match": { "field1": "value1" }
}
}
}
}
在这个示例中,查询将查找具有 field1
为 value1
的父文档的子文档。
33. 使用 terms_set
查询
terms_set
查询用于匹配字段值与查询中的多个值集合的交集。
示例:匹配字段值与查询中的多个值集合的交集
{
"query": {
"terms_set": {
"field1": {
"terms": ["value1", "value2", "value3"],
"minimum_should_match_field": "required_matches"
}
}
}
}
在这个示例中,查询将匹配 field1
的值与 ["value1", "value2", "value3"]
集合的交集,并且交集的大小由 required_matches
字段指定。
34. 使用 intervals
查询
intervals
查询用于基于间隔匹配文本。
示例:基于间隔匹配文本
{
"query": {
"intervals": {
"field1": {
"all_of": {
"intervals": [
{ "match": { "query": "value1" } },
{ "match": { "query": "value2" } }
],
"max_gaps": 5,
"ordered": true
}
}
}
}
}
在这个示例中,查询将匹配 field1
中包含 value1
和 value2
,并且它们之间的最大间隔为 5 且顺序一致的文档。
35. 使用 rank_feature
查询
rank_feature
查询用于基于特征字段的值对文档进行排名。
示例:基于特征字段的值对文档进行排名
{
"query": {
"rank_feature": {
"field": "feature_field",
"boost": 1.5
}
}
}
在这个示例中,查询将基于 feature_field
的值对文档进行排名,并应用一个 1.5
的提升因子。
36. 使用 distance_feature
查询
distance_feature
查询用于基于距离对文档进行排名。
示例:基于距离对文档进行排名
{
"query": {
"distance_feature": {
"field": "date_field",
"pivot": "7d",
"origin": "now"
}
}
}
在这个示例中,查询将基于 date_field
的值与当前时间的距离对文档进行排名,使用 7d
作为基准距离。
37. 使用 script
查询
script
查询允许你使用脚本来定义自定义查询逻辑。
示例:使用脚本定义自定义查询逻辑
{
"query": {
"script": {
"script": {
"source": "doc['field1'].value > params.threshold",
"params": {
"threshold": 10
}
}
}
}
}
在这个示例中,查询将匹配 field1
的值大于 10
的文档。
38. 使用 wrapper
查询
wrapper
查询用于包装一个 Base64 编码的查询。
示例:包装一个 Base64 编码的查询
{
"query": {
"wrapper": {
"query": "eyJ0ZXJtIjp7ImZpZWxkMSI6InZhbHVlMSJ9fQ=="
}
}
}
在这个示例中,查询将解码 Base64 编码的查询 eyJ0ZXJtIjp7ImZpZWxkMSI6InZhbHVlMSJ9fQ==
并执行它。
39. 使用 exists
查询
exists
查询用于匹配包含特定字段的文档。
示例:匹配包含特定字段的文档
{
"query": {
"exists": {
"field": "field1"
}
}
}
在这个示例中,查询将匹配包含 field1
字段的文档。
40. 使用 type
查询
type
查询用于匹配特定类型的文档。
示例:匹配特定类型的文档
{
"query": {
"type": {
"value": "type1"
}
}
}
在这个示例中,查询将匹配类型为 type1
的文档。
41. 使用 terms
查询
terms
查询用于匹配字段值在给定集合中的文档。
示例:匹配字段值在给定集合中的文档
{
"query": {
"terms": {
"field1": ["value1", "value2", "value3"]
}
}
}
在这个示例中,查询将匹配 field1
的值在 ["value1", "value2", "value3"]
集合中的文档。
42. 使用 wildcard
查询
wildcard
查询用于匹配包含通配符的字段值。
示例:匹配包含通配符的字段值
{
"query": {
"wildcard": {
"field1": "val*"
}
}
}
在这个示例中,查询将匹配 field1
的值以 val
开头的文档。
43. 使用 regexp
查询
regexp
查询用于匹配符合正则表达式的字段值。
示例:匹配符合正则表达式的字段值
{
"query": {
"regexp": {
"field1": "val.*"
}
}
}
在这个示例中,查询将匹配 field1
的值符合正则表达式 val.*
的文档。
44. 使用 prefix
查询
prefix
查询用于匹配匹配以特定前缀开头的字段值。
示例:匹配以特定前缀开头的字段值
{
"query": {
"prefix": {
"field1": "val"
}
}
}
在这个示例中,查询将匹配 field1
的值以 val
开头的文档。
45. 使用 fuzzy
查询
fuzzy
查询用于匹配与给定值相似的字段值,允许一定程度的模糊匹配。
示例:匹配与给定值相似的字段值
{
"query": {
"fuzzy": {
"field1": {
"value": "value1",
"fuzziness": "AUTO"
}
}
}
}
在这个示例中,查询将匹配 field1
的值与 value1
相似的文档,模糊度设置为 AUTO
。
46. 使用 ids
查询
ids
查询用于匹配特定 ID 的文档。
示例:匹配特定 ID 的文档
{
"query": {
"ids": {
"values": ["1", "2", "3"]
}
}
}
在这个示例中,查询将匹配 ID 为 1
、2
或 3
的文档。
47. 使用 geo_shape
查询
geo_shape
查询用于匹配地理形状字段。
示例:匹配地理形状字段
{
"query": {
"geo_shape": {
"location": {
"shape": {
"type": "envelope",
"coordinates": [[13.0, 53.0], [14.0, 52.0]]
},
"relation": "within"
}
}
}
}
在这个示例中,查询将匹配 location
字段在指定的地理形状内的文档。
48. 使用 geo_bounding_box
查询
geo_bounding_box
查询用于匹配在指定地理边界框内的文档。
示例:匹配在指定地理边界框内的文档
{
"query": {
"geo_bounding_box": {
"location": {
"top_left": {
"lat": 53.0,
"lon": 13.0
},
"bottom_right": {
"lat": 52.0,
"lon": 14.0
}
}
}
}
}
在这个示例中,查询将匹配 location
字段在指定地理边界框内的文档。
49. 使用 geo_distance
查询
geo_distance
查询用于匹配在指定距离内的文档。
示例:匹配在指定距离内的文档
{
"query": {
"geo_distance": {
"distance": "200km",
"location": {
"lat": 52.0,
"lon": 13.0
}
}
}
}
在这个示例中,查询将匹配 location
字段在距离 52.0, 13.0
200 公里范围内的文档。
50. 使用 geo_polygon
查询
geo_polygon
查询用于匹配在指定地理多边形内的文档。
示例:匹配在指定地理多边形内的文档
{
"query": {
"geo_polygon": {
"location": {
"points": [
{ "lat": 52.0, "lon": 13.0 },
{ "lat": 53.0, "lon": 14.0 },
{ "lat": 52.5, "lon": 13.5 }
]
}
}
}
}
在这个示例中,查询将匹配 location
字段在指定地理多边形内的文档。