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

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

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

"mappings": {
      "properties": {
        "grocery_name": {
          "type": "text"
        },
        "items": {
          "type": "nested",
          "properties": {
            "name": {
              "type": "text"
            },
            "stock": {
              "type": "integer"
            },
            "category": {
              "type": "text"
            }
          }
        }
      }
    }

数据如下所示

{
  "grocery_name": "Elastic Eats",
  "items": [
    {
      "name": "Red banana",
      "stock": "12",
      "category": "fruit"
    },
    {
      "name": "Cavendish banana",
      "stock": "10",
      "category": "fruit"
    },
    {
      "name": "peach",
      "stock": "10",
      "category": "fruit"
    },
    {
      "name": "carrot",
      "stock": "9",
      "category": "vegetable"
    },
    {
      "name": "broccoli",
      "stock": "5",
      "category": "vegetable"
    }
  ]
}

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

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "items",
            "query": {
              "match_phrase": {
                "items.name": {
                  "query": "carrot"
                }
              }
            }
          }
        },
        {
          "nested": {
            "path": "items",
            "query": {
              "match_phrase": {
                "items.name": {
                  "query": "peach"
                }
              }
            }
          }
        }
      ]
    }
  }
}

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


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

vybvopom

vybvopom1#

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

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "inner_hits": {
              "name": "carrot"     <--
            }, 
            "path": "items",
            "query": {
              "match_phrase": {
                "items.name": {
                  "query": "carrot"
                }
              }
            }
          }
        },
        {
          "nested": {
            "inner_hits": {     
              "name": "peach"      <--
            },
            "path": "items",
            "query": {
              "match_phrase": {
                "items.name": {
                  "query": "peach"
                }
              }
            }
          }
        }
      ]
    }
  }
}

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

相关问题