多个嵌套路径上的Elasticsearch过滤器

0kjbasz6  于 2023-10-17  发布在  ElasticSearch
关注(0)|答案(1)|浏览(184)

我有一个ES索引,嵌套数据Map如下所示

  1. "mappings": {
  2. "voertuig": {
  3. "properties": {
  4. "vestiging": {
  5. "properties": {
  6. "name_dtc": {
  7. "type": "string",
  8. "fields": {
  9. "raw": {
  10. "index": "not_analyzed",
  11. "type": "string"
  12. }
  13. }
  14. },
  15. },
  16. "type": "nested"
  17. },
  18. "accessoires": {
  19. "properties": {
  20. "name": {
  21. "type": "string",
  22. "fields": {
  23. "raw": {
  24. "index": "not_analyzed",
  25. "type": "string"
  26. }
  27. }
  28. }
  29. },
  30. "type": "nested"
  31. }
  32. }
  33. }
  34. }

我想创建一个查询,对两个(原始)值进行过滤。我可以创建一个过滤器,过滤这些值之一,如下所示:

  1. {
  2. "body": {
  3. "post_filter": {
  4. "nested": {
  5. "filter": {
  6. "bool": {
  7. "must": [
  8. {
  9. "term": {
  10. "vestiging.name_dtc.raw": "Location X"
  11. }
  12. }
  13. ]
  14. }
  15. },
  16. "path": "vestiging"
  17. }
  18. },
  19. "query": {
  20. "match_all": { }
  21. }
  22. },
  23. "index": "ocm",
  24. "type": "voertuig"
  25. }

然而,我需要的是这样的东西:

  1. {
  2. "body": {
  3. "post_filter": {
  4. "nested": [
  5. {
  6. "filter": {
  7. "bool": {
  8. "must": [
  9. {
  10. "term": {
  11. "accessoires.name.raw": "Climate Control"
  12. }
  13. }
  14. ]
  15. }
  16. },
  17. "path": "opties"
  18. },
  19. {
  20. "filter": {
  21. "bool": {
  22. "must": [
  23. {
  24. "term": {
  25. "vestiging.name_dtc.raw": "Location X"
  26. }
  27. }
  28. ]
  29. }
  30. },
  31. "path": "vestiging"
  32. }
  33. ]
  34. },
  35. "query": {
  36. "filtered": {
  37. "filter": {
  38. "term": {
  39. "key": "33e75ff09dd6"
  40. }
  41. },
  42. "query": []
  43. }
  44. }
  45. },
  46. "index": "ocm",
  47. "type": "voertuig"
  48. }

第一个查询工作,第二个查询引发错误:
nested:QueryParsingException[[ocm] [nested] filter不支持[null]];
如何创建一个匹配多个路径中的字段的过滤器?

lnxxn5zx

lnxxn5zx1#

这个怎么样:

  1. {
  2. "query" : {
  3. "filtered" : {
  4. "filter" : {
  5. "bool" : {
  6. "must" : [
  7. {
  8. "nested": {
  9. "filter": {
  10. "term": {
  11. "accessoires.name.raw": "Climate Control"
  12. }
  13. },
  14. "path": "accessoires"
  15. }
  16. },
  17. {
  18. "nested": {
  19. "filter": {
  20. "term": {
  21. "vestiging.name_dtc.raw": "Location X"
  22. }
  23. },
  24. "path": "vestiging"
  25. }
  26. },
  27. {
  28. "term": {
  29. "key": "33e75ff09dd6"
  30. }
  31. }
  32. ]
  33. }
  34. }
  35. }
  36. }
  37. }

我认为您遇到的问题是由于不正确使用嵌套过滤器的结果,尽管从异常消息中获得确切的问题有点困难。本质上,如果你想合并两个嵌套的过滤器,你将不得不使用booland过滤器对它们进行分组。
我已经减少了查询相当多的一个较小的职位的缘故。我没有post_filter,因为你的例子中没有任何聚合。我把内部的bool过滤器替换成了他们拥有的单个术语过滤器,并在附加的键(term)过滤器上标记。但是您可以继续使用您的查询结构,并根据需要扩展它,主要修复解决如何将两个嵌套过滤器放在一起。

展开查看全部

相关问题