当前位置: 首页 > 知识库问答 >
问题:

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

南门正祥
2023-03-14

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

下面是示例用例:

我有一个映射:

"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"
    }
  ]
}

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

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

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



[inner_hits] 已包含键 [项目] 的条目

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

共有1个答案

公孙嘉禧
2023-03-14

您当然可以有多个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"
                }
              }
            }
          }
        }
      ]
    }
  }
}

如果没有提供名称,系统将默认使用嵌套路径,即两个子查询中的< code>items。

 类似资料:
  • 我在这里遵循这个例子: https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html 以下查询: 与预期的一条记录匹配。假设我只想返回用户为“约翰·史密斯”和“艾利斯·怀特”的文档。 我试过: 但这返回零结果。我如何获得同时包含“Alice White”和“John Smith”的文档(这应该只是在原始结果中

  • 我有几个产品的变化,像下面的一个 我正在寻找一个具有以下所有参数的查询 获取某个类别中的所有产品 获取所有黑色的产品 获取尺寸l和M 我当前的查询: 它的工作很好,如果我只搜索1个大小。但是一旦我搜索了2个尺寸,它就不会给出任何记录。我的猜测是,它在每个嵌套变体中寻找所有3个参数,显然它找不到。如何修改要搜索的查询 null 我的第二个问题:

  • 基本问题如下:有没有一种方便的方法可以为嵌套查询的所有字段指定多字段匹配?对于普通查询有效。这在嵌套查询中不起作用,可能是因为嵌套对象没有_all? 下面是更详细的问题: 我有一个名为“Parent”的嵌套文档,如下所示: 这是我用于制作儿童嵌套对象的映射: 这是一个查询,我想使用所有子字段的匹配来选择几个术语查询,以及一个术语查询: 上述查询不起作用,因为我无法为嵌套对象选择多匹配查询中的所有字

  • 假设我有一些用户使用以下文档编制索引: ElasticSearch DSL是否允许我构造一个查询,在该查询中,我可以根据人们的电子邮件地址进行搜索,但前提是该地址处于活动状态?更抽象地说,根据嵌套对象的其他属性搜索文档。 满足此条件的搜索将返回此文档以搜索或,但在搜索时不会返回此文档。

  • 我有一个弹性搜索索引集合,如下所示, 现在我需要通过将与其值匹配来搜索文档。(是一些字段,其值存储在中)例如。对于字段,如果它是,则应与上述文档匹配。 我尝试将其映射为嵌套对象,但我无法编写查询来搜索与其相应值匹配的2个或更多的键id。