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

不相关嵌套数据的Elasticsearch筛选

穆城
2023-03-14

好的,今天我遇到了一个问题,要过滤一个带有双重嵌套非相关字段specs.value.textspecs.spec.text的elasticsearch查询。

这些字段的映射:

...
"specs": {
"type": "nested",
"properties": {
"spec": {
  "type": "nested",
  "properties": {
    "text": {
      "type": "string",
      "fields": {
        "raw": {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }
  }
},

"value": {
"type": "nested",
"properties": {
  "text": {
    "type": "string",
    "fields": {
      "raw": {
        "type": "string",
        "index": "not_analyzed"
        }
      }
    }
    }
  }
}
}
....
    {
      "query": {
        "filtered": {
          "filter": {
            "and": {
              "filters": [
                {
                  "nested": {
                    "filter": {
                      "nested": {
                        "filter": {
                          "match": {
                            "specs.value.text": "10"
                          }
                        },
                        "path": "specs.value"
                      }
                    },
                    "path": "specs"
                  }
                },
                {
                  "nested": {
                    "filter": {
                      "nested": {
                        "filter": {
                          "match": {
                            "specs.spec.text": "Délai de livraison"
                          }
                        },
                        "path": "specs.spec"
                      }
                    },
                    "path": "specs"
                  }
                }
              ]
            }
          },
          "query": {
            "match_all": {}
          }
        }
      },
      "_source": [
        "specs"
      ]
    }
  ...
  "specs": [
      {
        "value": [
          {
            "text": "10",
            "lang": "fr-FR"
          }
        ],
        "spec": [
          {
            "text": "Délai de livraison",
            "lang": "fr-FR"
          }
        ]
      },


      {

        "value": [
          {
            "text": "10",
            "lang": "fr-FR"
          }
        ],
        "spec": [
          {
            "text": "Volume",
            "lang": "fr-FR"
          }
        ]
      }
  ]
  ...
    ...
    "specs": [
      {
        "value": [
          {
            "text": "7"
          }
        ]
        "spec": [
          {
            "text": "Délai de livraison"
          }
        ]
      }
    ]
    ...

共有1个答案

欧阳衡
2023-03-14

正确的查询应如下所示

{
    "query": {
        "bool": {
            "must": [{
                "nested": {
                    "path": "specs",
                    "query": {
                        "bool": {
                            "must": [{
                                "nested": {
                                    "path": "specs.value",
                                    "query": {
                                        "bool": {
                                            "must": [{
                                                "match": {
                                                    "specs.value.text": "10"
                                                }
                                            }]
                                        }
                                    }
                                }
                            }, {
                                "nested": {
                                    "path": "specs.spec",
                                    "query": {
                                        "bool": {
                                            "must": [{

                                                "match": {
                                                    "specs.spec.text": "Délai de livraison"

                                                }
                                            }]
                                        }
                                    }
                                }
                            }]
                        }
                    }
                }
            }]
        }
    }
}

因为您在specs级别上运行了两个嵌套查询,所以这两个文档都匹配,因为这两个文档都匹配每个过滤器,但在specs下的不同嵌套文档中。若要为同一嵌套文档设置and条件的范围,请在一个嵌套查询下激发筛选器

希望这能帮助Ajay

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

  • 我是Elasticsearch的新手,我试图创建一个过滤器来检索具有特定属性的文档。 属性在映射中定义为嵌套对象,如下所示: 我试图以以下形式执行一个复杂的查询: 这是elasticsearch 2.x。我做错了什么?

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

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

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

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