当前位置:  首页>> 技术小册>> ElasticSearch零基础到实战

本文将介绍ElasticSearch的组合查询,并提供相应的代码示例。代码尽量简短,以便读者快速上手使用该API。

组合查询概述
组合查询是一种多个查询条件组合起来的查询类型,常用于过滤出符合多个条件的文档。ElasticSearch提供了多种组合查询类型,包括bool查询、dis_max查询、constant_score查询等。

其中,最常用的组合查询类型是bool查询,它可以将多个查询条件组合起来,使用逻辑运算符(AND/OR/NOT)进行组合。

bool查询的基本语法如下所示:

  1. {
  2. "query": {
  3. "bool": {
  4. "must": [
  5. {
  6. "match": {
  7. "title": "ElasticSearch"
  8. }
  9. },
  10. {
  11. "range": {
  12. "date": {
  13. "gte": "2020-01-01",
  14. "lte": "2020-12-31"
  15. }
  16. }
  17. }
  18. ],
  19. "must_not": [
  20. {
  21. "term": {
  22. "status": "deleted"
  23. }
  24. }
  25. ],
  26. "should": [
  27. {
  28. "match": {
  29. "content": "search"
  30. }
  31. }
  32. ]
  33. }
  34. }
  35. }

其中,“must”表示必须满足的条件,“must_not”表示不能满足的条件,“should”表示可选的条件。如果所有的“must”条件和“should”条件都满足,则该文档符合查询条件,将被返回;如果有任何一个“must_not”条件满足,则该文档将被排除。

组合查询代码示例
下面是一个使用bool查询查询名为“my_index”的索引中,同时包含关键字“ElasticSearch”和“search”,且在2020年内创建的文档的示例代码:

  1. import requests
  2. url = "http://localhost:9200/my_index/_search"
  3. headers = {
  4. "Content-Type": "application/json"
  5. }
  6. data = """
  7. {
  8. "query": {
  9. "bool": {
  10. "must": [
  11. {
  12. "match": {
  13. "title": "ElasticSearch"
  14. }
  15. },
  16. {
  17. "match": {
  18. "content": "search"
  19. }
  20. },
  21. {
  22. "range": {
  23. "date": {
  24. "gte": "2020-01-01",
  25. "lte": "2020-12-31"
  26. }
  27. }
  28. }
  29. ]
  30. }
  31. }
  32. }
  33. """
  34. response = requests.get(url, headers=headers, data=data)
  35. print(response.json())

上述代码向ElasticSearch实例的“/my_index/_search”路径发送了一个JSON格式的数据,该数据定义了查询的内容。在这里,我们使用bool查询查询名为“my_index”的索引中,同时包含关键字“ElasticSearch”和“search”,且在2020年内创建的文档。该查询条件是由“must”子句中的两个“match”查询和一个“range”查询组合而成的。

如果我们想查询不包含关键字“ElasticSearch”的文档,可以使用下面的代码:

  1. import requests
  2. url = "http://localhost:9200/my_index/_search"
  3. headers = {
  4. "Content-Type": "application/json"
  5. }
  6. data = """
  7. {
  8. "query": {
  9. "bool": {
  10. "must_not": [
  11. {
  12. "match": {
  13. "title": "ElasticSearch"
  14. }
  15. }
  16. ],
  17. "filter": [
  18. {
  19. "range": {
  20. "date": {
  21. "gte": "2020-01-01",
  22. "lte": "2020-12-31"
  23. }
  24. }
  25. }
  26. ]
  27. }
  28. }
  29. }
  30. """
  31. response = requests.get(url, headers=headers, data=data)
  32. print(response.json())

在上述代码中,我们将bool查询的“must_not”子句中的“match”查询改为了“must_not”查询,该查询表示必须不包含关键字“ElasticSearch”。我们还添加了一个“filter”子句,该子句表示必须满足“date”字段的范围条件。

小结:
组合查询是ElasticSearch中非常常见和有用的查询类型。通过组合多个查询条件,我们可以更加精确地过滤文档,从而得到我们需要的结果。

本文介绍了ElasticSearch中的bool查询,并提供了相应的代码示例。我们可以根据自己的需求调整查询条件,以达到最优的查询结果。


该分类下的相关小册推荐: