Elasticsearch |过滤不相关的嵌套数据

时间:2017-04-06 10:00:01

标签: json elasticsearch

好的,今天我在使用双嵌套不相关字段specs.value.textspecs.spec.text过滤弹性搜索查询时遇到问题。

这些字段的映射:

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

Elasticsearch将在Délai de livraison

中的specs.spec.text 10中返回包含单词specs.value.text的文档

结果的例子:   第一个对象:

  ...
  "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 个答案:

答案 0 :(得分:0)

正确的查询应该是以下

{
    "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"

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

由于您在规范级别运行了两个嵌套查询,因此两个文档都匹配,因为两个文档都匹配每个过滤器,但是在规范下的不同嵌套文档中。要限制同一嵌套文档的条件和条件,请在一个嵌套查询

下触发过滤器

希望这会有所帮助 阿贾伊