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

Elasticsearch嵌套对象筛选器

柳昊焱
2023-03-14

我是Elasticsearch的新手,我试图创建一个过滤器来检索具有特定属性的文档。

属性在映射中定义为嵌套对象,如下所示:

"attributes": {
  "type": "nested",
    "properties" : {
      "id": {
        "type": "integer"
      },
      ...
    }
  }
}

我试图以以下形式执行一个复杂的查询:

(attribute.id == 1 OR attribute.id == 2) AND (attribute.id == 3 OR attribute.id == 4)
{
  "query": {
    "filtered": {
     "query": {
        "match_all": {}
     },
     "filter": {
        "nested": {
           "path": "attributes",
           "filter": {
              "bool": {
                "must": [
                    { "bool" : {
                      "should" : [
                        { "term": { "attributes.id": 1 }},
                        { "term": { "attributes.id": 2 }}
                      ]
                    }},
                    { "bool" : {
                      "should" : [
                        { "term": { "attributes.id": 3 }},
                        { "term": { "attributes.id": 4 }}
                      ]
                    }}
                ]
              }
           }
        }
     }
  }
},
"sort": {
    "date": { "order": "desc" }
  }
}
"must": [
  { "term": { "attributes.id": 3 }},
  { "bool" : {
    "should" : [
      { "term": { "attributes.id": 1 }},
      { "term": { "attributes.id": 2 }}
    ]
  }}
]

这是elasticsearch 2.x。我做错了什么?

共有1个答案

龙弘盛
2023-03-14

为了获得要查找的结果,需要执行两个单独的嵌套查询,并用bool查询将它们链接在一起。

下面是一个例子:

{
  "bool":{
    "must":[
      {
        "nested":{
          "path":"attributes",
          "filter":{
            "bool":{
              "should":[
                { "term": {"attributes.id": 1 }},
                { "term": {"attributes.id": 2 }}
              ]
            }
          }
        }
      },
      {
        "nested":{
          "path":"attributes",
          "filter":{
            "bool":{
              "should":[
                { "term": {"attributes.id": 3 }},
                { "term": {"attributes.id": 4 }}
              ]
            }
          }
        }
      }
    ]
  }
}

这是由于嵌套文档和嵌套查询之间的细微差别造成的。看一下文档中关于嵌套查询的部分,它说:

对嵌套对象/文档执行查询,就好像它们被索引为单独的文档(它们是内部的),并产生根父文档(或父嵌套映射)。

在执行嵌套查询时,实际上并不是针对根文档执行查询(尽管感觉是这样)。查询对嵌套文档进行操作,就像它们是单独的文档一样。

因此,当查询同时具有id=(1或2)和id=(3或4)的嵌套文档时,不会得到任何结果。在您的数据中,每个嵌套文档似乎只有这些id值中的一个。

 类似资料:
  • 我希望能够过滤评论,所以只有真正的评论将为每个博客对象显示。我想展示每一个博客,而不仅仅是那些有真实评论的博客。我在网上找到的所有其他解决方案似乎都影响了我的博客对象。有没有一种方法可以过滤掉评论对象而不影响所有博客的查询? 因此,上述示例将在查询之后返回: 该示例仍然显示了没有评论或错误评论的博客。 这可能吗? 我一直在使用这个示例中的嵌套查询:ElasticSearch-Get只匹配嵌套对象与

  • 我正试图找出如何解决这两个问题,我有我的ES 5.6索引。 我需要创建两个单独的脚本过滤器: 1-筛选employee数组大小==3的文档 2-筛选数组第一个元素为“name”==“John”的文档 我试图做一些第一步,但我无法迭代列表。我总是有一个空指针异常错误。

  • 我试图构造一个ElasticSearch查询,但没有得到预期的结果。任何帮助都将不胜感激! 映射详细信息: null null 目前,每个嵌套的轮班文档都包含一个嵌套的calendarBlock文档,其中包含开始和结束日期时间字段,以及一个可以注册该轮班的最大志愿者人数字段。 查询 我试图构造的查询是经过筛选的查询。从Web上的窗体传入查询字符串。然后,我需要以编程方式将至少三个筛选器附加到这个查

  • 我的文档具有如下所示的嵌套字段: 嵌套字段的映射如下所示: 在切换到ElasticSearch2之前,我使用aggs查询了没有结果的文档。以下是查询的聚合部分: 现在我切换到了ElasticSerach2,它只计算所有文档。我已经尝试了不同的方法,比如计算所有文档和计算结果,这样我就可以减去结果,但是 总是0 如何正确筛选/计算嵌套字段?

  • 好吧,这一个对你们中的一个超级棒的弹性搜索专家来说可能不会太难。我得到了这个嵌套查询,我希望嵌套查询在一个非嵌套字段(状态)上进行过滤。我不知道把过滤器放在哪里。我试着把它放在一个查询中(如下),但没有给出正确的结果。你能帮我吗?

  • null 我也尝试使用scripted_field,但是脚本字段似乎是在最后一个阶段计算的,在查询过程中不可用。 我也有一个按照相同逻辑进行排序的方法(根据给定仓库中库存的总和对产品进行排序),它像一个魅力一样工作: 但我也找不到访问此排序值的方法:(