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

Cod*_*ard 2 lucene elasticsearch elasticsearch-dsl nested-object

如何编写包含两个搜索词的查询,这些搜索词与突出显示内部匹配的嵌套对象相匹配。

\n

以下是示例用例:

\n

我有一个映射:

\n
"mappings": {\n      "properties": {\n        "grocery_name": {\n          "type": "text"\n        },\n        "items": {\n          "type": "nested",\n          "properties": {\n            "name": {\n              "type": "text"\n            },\n            "stock": {\n              "type": "integer"\n            },\n            "category": {\n              "type": "text"\n            }\n          }\n        }\n      }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

数据如下所示

\n
{\n  "grocery_name": "Elastic Eats",\n  "items": [\n    {\n      "name": "Red banana",\n      "stock": "12",\n      "category": "fruit"\n    },\n    {\n      "name": "Cavendish banana",\n      "stock": "10",\n      "category": "fruit"\n    },\n    {\n      "name": "peach",\n      "stock": "10",\n      "category": "fruit"\n    },\n    {\n      "name": "carrot",\n      "stock": "9",\n      "category": "vegetable"\n    },\n    {\n      "name": "broccoli",\n      "stock": "5",\n      "category": "vegetable"\n    }\n  ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在这里,如果我想要一个在嵌套文档中都有桃子胡萝卜的文档\ni可以使用多个嵌套查询进行搜索,如下所示

\n
{\n  "query": {\n    "bool": {\n      "must": [\n        {\n          "nested": {\n            "path": "items",\n            "query": {\n              "match_phrase": {\n                "items.name": {\n                  "query": "carrot"\n                }\n              }\n            }\n          }\n        },\n        {\n          "nested": {\n            "path": "items",\n            "query": {\n              "match_phrase": {\n                "items.name": {\n                  "query": "peach"\n                }\n              }\n            }\n          }\n        }\n      ]\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

上面的查询工作完美,但是如果我添加内部命中,我无法为两个嵌套查询添加,如果我这样做,我会收到以下错误

\n
\n

\xe2\x80\xa8\xe2\x80\xa8[inner_hits] 已包含 key[items] 的条目

\n
\n

我想要突出显示每个匹配的嵌套对象,因为elasticsearch 不支持_source突出显示 有什么方法可以突出显示每个嵌套对象?

\n

Joe*_*ook 5

您当然可以有多个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"
                }
              }
            }
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果未提供名称,您将收到错误 b/c,系统将默认使用items两个子查询中的嵌套路径。