本文将介绍ElasticSearch的组合查询,并提供相应的代码示例。代码尽量简短,以便读者快速上手使用该API。
组合查询概述
组合查询是一种多个查询条件组合起来的查询类型,常用于过滤出符合多个条件的文档。ElasticSearch提供了多种组合查询类型,包括bool查询、dis_max查询、constant_score查询等。
其中,最常用的组合查询类型是bool查询,它可以将多个查询条件组合起来,使用逻辑运算符(AND/OR/NOT)进行组合。
bool查询的基本语法如下所示:
{ "query": { "bool": { "must": [ { "match": { "title": "ElasticSearch" } }, { "range": { "date": { "gte": "2020-01-01", "lte": "2020-12-31" } } }], "must_not": [ { "term": { "status": "deleted" } }], "should": [ { "match": { "content": "search" } }] } } }
其中,“must”表示必须满足的条件,“must_not”表示不能满足的条件,“should”表示可选的条件。如果所有的“must”条件和“should”条件都满足,则该文档符合查询条件,将被返回;如果有任何一个“must_not”条件满足,则该文档将被排除。
组合查询代码示例
下面是一个使用bool查询查询名为“my_index”的索引中,同时包含关键字“ElasticSearch”和“search”,且在2020年内创建的文档的示例代码:
import requests url = "http://localhost:9200/my_index/_search" headers = { "Content-Type": "application/json" } data = """ { "query": { "bool": { "must": [ { "match": { "title": "ElasticSearch" } }, { "match": { "content": "search" } }, { "range": { "date": { "gte": "2020-01-01", "lte": "2020-12-31" } } } ] } } } """ response = requests.get(url, headers=headers, data=data) print(response.json())
上述代码向ElasticSearch实例的“/my_index/_search”路径发送了一个JSON格式的数据,该数据定义了查询的内容。在这里,我们使用bool查询查询名为“my_index”的索引中,同时包含关键字“ElasticSearch”和“search”,且在2020年内创建的文档。该查询条件是由“must”子句中的两个“match”查询和一个“range”查询组合而成的。
如果我们想查询不包含关键字“ElasticSearch”的文档,可以使用下面的代码:
import requests url = "http://localhost:9200/my_index/_search" headers = { "Content-Type": "application/json" } data = """ { "query": { "bool": { "must_not": [ { "match": { "title": "ElasticSearch" } } ], "filter": [ { "range": { "date": { "gte": "2020-01-01", "lte": "2020-12-31" } } } ] } } } """ response = requests.get(url, headers=headers, data=data) print(response.json())
在上述代码中,我们将bool查询的“must_not”子句中的“match”查询改为了“must_not”查询,该查询表示必须不包含关键字“ElasticSearch”。我们还添加了一个“filter”子句,该子句表示必须满足“date”字段的范围条件。
小结:
组合查询是ElasticSearch中非常常见和有用的查询类型。通过组合多个查询条件,我们可以更加精确地过滤文档,从而得到我们需要的结果。
本文介绍了ElasticSearch中的bool查询,并提供了相应的代码示例。我们可以根据自己的需求调整查询条件,以达到最优的查询结果。