当前位置:   article > 正文

ES dsl查询filter(或must)和should并用时should子句不生效_es filter should

es filter should

记录下今天编码时遇到的问题,在filter和should同级并用的查询下,should子句并没有生效,只有filter子句生效。

例如以下dsl

  1. {
  2. "query": {
  3. "bool": {
  4. "filter": [
  5. {
  6. "term": {
  7. "status": 3
  8. }
  9. }
  10. ],
  11. "should": [
  12. {
  13. "bool": {
  14. "filter": [
  15. {
  16. "bool": {
  17. "must_not": {
  18. "exists": {
  19. "field": "last_recheck_time"
  20. }
  21. }
  22. }
  23. },
  24. {
  25. "range": {
  26. "qc_end_time": {
  27. "lte": 1713769642
  28. }
  29. }
  30. }
  31. ]
  32. }
  33. },
  34. {
  35. "range": {
  36. "last_recheck_time": {
  37. "lte": 1713769642
  38. }
  39. }
  40. }
  41. ]
  42. }
  43. }
  44. }

这是因为在filter/must和should并列使用时,当filter/must满足时,should子句默认会被忽略,如果需要filter/must满足的同时,should中的条件也要满足,有两种方法可以修改我们原本的查询。

方法1 使用minimum_should_match

在should同级增加参数minimum_should_match,修改后的dsl如下

  1. {
  2. "query": {
  3. "bool": {
  4. "filter": [
  5. {
  6. "term": {
  7. "status": 3
  8. }
  9. }
  10. ],
  11. "minimum_should_match":1,
  12. "should": [
  13. {
  14. "bool": {
  15. "filter": [
  16. {
  17. "bool": {
  18. "must_not": {
  19. "exists": {
  20. "field": "last_recheck_time"
  21. }
  22. }
  23. }
  24. },
  25. {
  26. "range": {
  27. "qc_end_time": {
  28. "lte": 1713769642
  29. }
  30. }
  31. }
  32. ]
  33. }
  34. },
  35. {
  36. "range": {
  37. "last_recheck_time": {
  38. "lte": 1713769642
  39. }
  40. }
  41. }
  42. ]
  43. }
  44. }
  45. }

方法2 合并filter和should子句

可将should子句和filter子句合并,将should子句作为filter子句内的一部分,达到想要的查询效果

  1. {
  2. "query": {
  3. "bool": {
  4. "filter": [
  5. {
  6. "term": {
  7. "status": 0
  8. }
  9. },
  10. {
  11. "bool": {
  12. "should": [
  13. {
  14. "bool": {
  15. "filter": [
  16. {
  17. "bool": {
  18. "must_not": {
  19. "exists": {
  20. "field": "last_recheck_time"
  21. }
  22. }
  23. }
  24. },
  25. {
  26. "range": {
  27. "qc_end_time": {
  28. "lte": 0
  29. }
  30. }
  31. }
  32. ]
  33. }
  34. }
  35. ,{
  36. "range": {
  37. "last_recheck_time": {
  38. "lte": 0
  39. }
  40. }
  41. }
  42. ]
  43. }
  44. }
  45. ]
  46. }
  47. }
  48. }

参考:

Bool Query | Elasticsearch Guide [5.0] | Elastic

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号