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

基于查询过滤elasticsearch查询中的嵌套对象

巩镜
2023-03-14

我有多个嵌套文档doc。嵌套查询工作正常,但它们仍然会返回所有嵌套对象(即整个文档),即使搜索查询只匹配少数嵌套对象。但是,它确实将文档作为一个整体进行过滤。

下面是一个例子:

PUT /demo
{
  "mappings": {
    "company": {
      "properties": {
        "employees": {
          "type": "nested"
        }
      }
    }
  }
}

PUT
/demo/company/1
{
  "id": 1,
  "name": "Google",
  "emp_count": 3,
  "employees": [{
    "id": 1,
    "name": "John",
    "address": {
      "city": "Mountain View",
      "state": "California",
      "country": "United States"
    }
  }]
}

PUT
/demo/company/2
{
  "id": 1,
  "name": "Facebook",
  "emp_count": 3,
  "employees": [{
    "id": 1,
    "name": "Amber",
    "address": {
      "city": "Bangalore",
      "state": "Karnataka",
      "country": "India"
    }
  }, {
    "id": 1,
    "name": "Adrian",
    "address": {
      "city": "Palo Alto",
      "state": "California",
      "country": "United States"
    }
  }]
}

PUT
/demo/company/3
{
  "id": 1,
  "name": "Microsoft",
  "emp_count": 3,
  "employees": [{
    "id": 1,
    "name": "Aman",
    "address": {
      "city": "New York",
      "state": "New York",
      "country": "United States"
    }
  }]
}

当在地址中搜索India时,理想情况下,我应该只获得带有一个嵌套对象的Facebook,但我会获得所有嵌套对象。如何筛选返回的嵌套对象?

示例查询:

{
  "query": {
    "function_score":{
      "query":{
        "nested":{
         "path":"employees",
         "score_mode":"max",
         "query": {
            "multi_match":{
              "query":"India",
              "type":"cross_fields",
              "fields":[
                "employees.address.city",
                "employees.address.country",
                "employees.address.state"
              ]
            }
          }
        }
      }
    }
  }
}

该查询的输出是facebook和所有员工,而我只想要amber

共有1个答案

潘弘博
2023-03-14

您可以使用inner_hits获得所需的结果。

GET /demo/company/_search
{
"query" : {
    "nested" : {
        "path" : "employees",
        "query" : {
            "match" : {"employees.address.country" : "India"}
        },
        "inner_hits" : {} 
    }
  }
}

产出将是:

"hits": {
  "total": 1,
  "max_score": 1.4054651,
  "hits": [
     {
        "_index": "demo",
        "_type": "company",
        "_id": "2",
        "_score": 1.4054651,
        "_source": {
           "id": 1,
           "name": "Facebook",
           "emp_count": 3,
           "employees": [
              {
                 "id": 1,
                 "name": "Amber",
                 "address": {
                    "city": "Bangalore",
                    "state": "Karnataka",
                    "country": "India"
                 }
              },
              {
                 "id": 1,
                 "name": "Adrian",
                 "address": {
                    "city": "Palo Alto",
                    "state": "California",
                    "country": "United States"
                 }
              }
           ]
        },
        "inner_hits": {
           "employees": {
              "hits": {
                 "total": 1,
                 "max_score": 1.4054651,
                 "hits": [
                    {
                       "_index": "demo",
                       "_type": "company",
                       "_id": "2",
                       "_nested": {
                          "field": "employees",
                          "offset": 0
                       },
                       "_score": 1.4054651,
                       "_source": {
                          "id": 1,
                          "name": "Amber",
                          "address": {
                             "city": "Bangalore",
                             "state": "Karnataka",
                             "country": "India"
                          }
                       }
                    }
                 ]
              }
           }
        }
     }
    ]
  }

您可以看到,inner_hits节只有符合条件的员工。但是在elasticsearch 1.5.0中引入了inner_hits。因此版本应该大于elasticsearch 1.5.0。您可以在这里查阅更多信息。

 类似资料:
  • 尊敬的弹性搜索专家, 我在查询嵌套对象时遇到问题。允许使用以下简化映射: 并将一些文档放在索引中: 现在我想执行这样的查询: 因此,我想得到匹配的公司与数量匹配的文件。因此,上面的查询应该会告诉我: 以下查询: 应该给我所有公司分配到一个文件,其标题包含“GPU”与匹配的文件数量: 如果表现良好,是否有可能实现这一结果?我显然对匹配的文档不感兴趣,只对匹配文档和嵌套对象的数量感兴趣。 谢谢你的帮助

  • 我试图创建一个嵌套查询,它将过滤掉一些带有特定术语的文档。在本例中,我试图过滤掉在user.first中有匹配术语的文档。数据示例: 我的查询没有得到所需的结果,因为它返回给我所有未筛选的记录。我尝试使用: 我希望这里得到与过滤器不匹配的文档。在这种情况下,它应该只返回第二个文档。做这件事的正确方法是什么?

  • 问题内容: 我在获取与Elasticsearch一起使用的嵌套查询时遇到问题(如果我删除了查询字符串之一,则可以使用)。我要解决的问题是我有一个包含关闭列表的文档(关闭)。我想在条件满足另一个值的闭包列表中搜索一个值。那只是从argan = 1的闭包中获得价值 我正在得到这个错误响应; 我的映射如下所示。 有人知道我在做什么错吗? 问题答案: 您的查询不是有效的查询。您需要使用适当的复合查询将其他

  • 问题内容: 我想使用ES进行图书搜索。因此,我决定将作者姓名和标题(作为嵌套文档)放入索引,如下所示: 我不明白的是:如何构造搜索查询,以便在搜索“一二”时仅找到第二本书,而在搜索“二三”时什么也找不到,而在搜索“一”时所有图书呢? 问题答案: 也许是这样的? 该查询基本上说一个文件必须有and 。您可以轻松地重新配置该查询。例如,如果您只想搜索作者,请删除嵌套部分。如果您想要另一本书,请更改嵌套

  • 问题内容: 这是我在elasticsearch中存储在索引上的数据类型。我必须找到包含主要成分牛肉(且重量小于1000)和成分-(辣椒粉且重量小于250),(橄榄油和重量小于300)以及所有其他成分类似的食谱。 索引的映射是 我的查询是 但这给了Null。有人可以帮我吗?我认为我没有正确使用嵌套查询 问题答案: 试试这个:

  • 问题内容: 我正在尝试使用query_string编写查询以检索嵌套对象的数据查询。 我想做的查询的一个例子是: 其中“ a”是嵌套对象,“ id”是“ a”的字段。 我知道我可以使用嵌套查询成功地执行此任务,编写如下查询: 但是,我想避免这种情况。我不想自己弄清楚用户正在搜索嵌套字段并修改查询。我尝试使用“ fields”参数,但它似乎不适用于嵌套对象。 是否可以使用“ query_string