如何在elasticsearch中将一个文档中的多个嵌套对象与内部命中匹配

cwxwcias  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(1)|浏览(666)

如何编写一个包含两个搜索项的查询,这两个搜索项匹配突出显示内部点击的嵌套对象。
下面是示例用例:
我有一个Map:

  1. "mappings": {
  2. "properties": {
  3. "grocery_name": {
  4. "type": "text"
  5. },
  6. "items": {
  7. "type": "nested",
  8. "properties": {
  9. "name": {
  10. "type": "text"
  11. },
  12. "stock": {
  13. "type": "integer"
  14. },
  15. "category": {
  16. "type": "text"
  17. }
  18. }
  19. }
  20. }
  21. }

数据如下所示

  1. {
  2. "grocery_name": "Elastic Eats",
  3. "items": [
  4. {
  5. "name": "Red banana",
  6. "stock": "12",
  7. "category": "fruit"
  8. },
  9. {
  10. "name": "Cavendish banana",
  11. "stock": "10",
  12. "category": "fruit"
  13. },
  14. {
  15. "name": "peach",
  16. "stock": "10",
  17. "category": "fruit"
  18. },
  19. {
  20. "name": "carrot",
  21. "stock": "9",
  22. "category": "vegetable"
  23. },
  24. {
  25. "name": "broccoli",
  26. "stock": "5",
  27. "category": "vegetable"
  28. }
  29. ]
  30. }

在这里,如果我想要一个在嵌套文档中同时包含peach和carrot的文档,我可以使用下面的多个嵌套查询进行搜索

  1. {
  2. "query": {
  3. "bool": {
  4. "must": [
  5. {
  6. "nested": {
  7. "path": "items",
  8. "query": {
  9. "match_phrase": {
  10. "items.name": {
  11. "query": "carrot"
  12. }
  13. }
  14. }
  15. }
  16. },
  17. {
  18. "nested": {
  19. "path": "items",
  20. "query": {
  21. "match_phrase": {
  22. "items.name": {
  23. "query": "peach"
  24. }
  25. }
  26. }
  27. }
  28. }
  29. ]
  30. }
  31. }
  32. }

上面的查询工作得很好,但是如果我添加了内部命中,我不能为两个嵌套查询都添加,如果添加了,我会得到以下错误


[内部点击数]已包含键[项目]的条目
我想突出显示每个匹配的嵌套对象,因为elasticsearch不支持源突出显示有没有任何方法可以突出显示每个嵌套对象?

vybvopom

vybvopom1#

你当然可以有多个 inner_hits 但它们需要适当命名:

  1. {
  2. "query": {
  3. "bool": {
  4. "must": [
  5. {
  6. "nested": {
  7. "inner_hits": {
  8. "name": "carrot" <--
  9. },
  10. "path": "items",
  11. "query": {
  12. "match_phrase": {
  13. "items.name": {
  14. "query": "carrot"
  15. }
  16. }
  17. }
  18. }
  19. },
  20. {
  21. "nested": {
  22. "inner_hits": {
  23. "name": "peach" <--
  24. },
  25. "path": "items",
  26. "query": {
  27. "match_phrase": {
  28. "items.name": {
  29. "query": "peach"
  30. }
  31. }
  32. }
  33. }
  34. }
  35. ]
  36. }
  37. }
  38. }

如果没有提供名称,系统将默认为嵌套路径 items 在两个子查询中。

展开查看全部

相关问题