Elasticsearch:查询包含数组中两个键值对的文档

时间:2015-05-21 20:38:55

标签: elasticsearch

如何查询包含两个键值对的文档" key1" - " value1"和" key2" - " value2"?我似乎无法找到相关文档。

我尝试了下面的查询,但即使应该有匹配的文档也不会返回结果。尽管如此,替换必须使用,但是当我将minimum_should_match = 100%时,它也不会返回任何结果。

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "attributes",
            "query": {
              "bool": {
                "must": [
                  [
                    {
                      "match_phrase": {
                        "attributes.key": "key1"
                      }
                    },
                    {
                      "match_phrase": {
                        "attributes.value": "value1"
                      }
                    }
                  ],
                  [
                    {
                      "match_phrase": {
                        "attributes.key": "key2"
                      }
                    },
                    {
                      "match_phrase": {
                        "attributes.value": "value2"
                      }
                    }
                  ]
                ]
              }
            }
          }
        },
        [
          {
            "match_all": {

            }
          }
        ]
      ]
    }
  }
}

这是映射的样子:

{
    "index_name": {
        "mappings": {
            "type_name": {
                "properties": {
                    "attributes": {
                        "type": "nested",
                        "properties": {
                            "key": {
                                "type": "string",
                                "analyzer": "flat"
                            },
                            "value": {
                                "type": "string",
                                "analyzer": "flat"
                            }
                        }
                    }
                }
            },
        }
    }
}

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

试试这个:

POST /test_index/_search
{
   "query": {
      "filtered": {
         "query": {
            "match_all": {}
         },
         "filter": {
            "bool": {
               "must": [
                  {
                     "nested": {
                        "path": "attributes",
                        "query": {
                           "bool": {
                              "must": [
                                 {
                                    "term": {
                                       "attributes.key": "key1"
                                    }
                                 },
                                 {
                                    "term": {
                                       "attributes.value": "value1"
                                    }
                                 }
                              ]
                           }
                        }
                     }
                  },
                  {
                     "nested": {
                        "path": "attributes",
                        "query": {
                           "bool": {
                              "must": [
                                 {
                                    "term": {
                                       "attributes.key": "key2"
                                    }
                                 },
                                 {
                                    "term": {
                                       "attributes.value": "value2"
                                    }
                                 }
                              ]
                           }
                        }
                     }
                  }
               ]
            }
         }
      }
   }
}

以下是我用来测试的代码(我刚用standard分析器,因为我不知道你的flat分析器是什么样的;所以你可能需要调整它:

http://sense.qbox.io/gist/13b7e2aa4d90bfb2f82787c6a00494ee3343e013

答案 1 :(得分:0)

我遇到了与Elastic 5相同的问题并且不得不稍微调整推荐的答案以使其工作,因为过滤的查询已被弃用。 (没有收到为[过滤]注册的[查询])。

使用Elastic 5,以下结构为我解决了这个问题:

{
    "query" : {
        "bool" : {
            "must" : [
                {
                    "nested" : {
                        "path": "attributes",
                        "query" : {
                            "bool" : {
                                "must" : [
                                    { "term" : { "attributes.key" : "key1" } },
                                    { "term" : { "attributes.value" : "value1" } }
                                ]
                            }
                        }
                    }
                },
                {
                    "nested" : {
                        "path" : "attributes",
                        "query" : {
                            "bool" : {
                                "must" : [
                                    { "term" : { "attributes.key" : "key2" } },
                                    { "term" : { "attributes.value" : "value2" } }
                                ]
                            }
                        }
                    }
                }
            ]
        }
    }
}