如何获取至少具有Elasticsearch查询中指定属性的所有文档?

时间:2015-02-20 14:23:06

标签: mysql elasticsearch

可以从索引中选择与某个子项的多个值匹配的项目吗?我认为这不是很清楚,但我在下面添加了更多细节。

我有以下索引:

{ "mappings" : { "entity" : { "properties" : { "name" : {"type" : "string"}, "features" : { "type" : "nested", "include_in_parent" : false, "properties" : { "id" : {"type" : "integer"}, "value_int" : {"type" : "integer"}, "value_text" : {"type" : "string"}, "value_decimal" : {"type" : "integer"}
} } } } }, "settings" : { "number_of_shards" : 1, "number_of_replicas" : 0 } }

索引中的一些项目

{
"name" : "Bazar",
"features" : [
    {
        "id" : 1,
        "value_text" : null,
        "value_decimal" : null,
        "value_int": 51
    },        
    {
        "id" : 9,
        "value_text" : "Amsterdam",
        "value_decimal" : null,
        "value_int": null
    }      
]

}

{
"name" : "Bazar Test",
"features" : [
    {
        "id" : 1,
        "value_text" : null,
        "value_decimal" : null,
        "value_int": 52
    },        
    {
        "id" : 9,
        "value_text" : "Leiden",
        "value_decimal" : null,
        "value_int": null
    }      
]

}

{
"name" : "Bazar no city",
"features" : [
    {
        "id" : 1,
        "value_text" : null,
        "value_decimal" : null,
        "value_int": 51
    },        
]

}

我需要的是一种只查找具有features.id = 1和features.id = 2(例如:“Bazar”和“Bazar Test”项目)的项目的方法。

我得到的一些问题是

{
"query" : {
    "nested" : {
        "path" : "features",
        "query" : {
            "bool" : {
                "must" : [
                    { "terms" : { "features.id" : [1, 9]} }
                ]
            }
        }
    }
}

}

此查询的问题在于它选择具有features.id = 1 OR features.id = 9的项目,以便返回所有项目。

修改 尝试了新的查询

{
"query" : {
    "nested" : {
        "path" : "features",
        "query" : {
            "bool" : {
                "must" : [
                    { "terms" : { 
                            "features.id" : [1, 9], 
                            "minimum_should_match": 2
                        }
                    }
                ]
            }
        }
    }
}

}

但我没有结果。

编辑:

在我将答案结合起来之后,我设法让它发挥作用。 谢谢你的帮助:)

这是我的查询(有点修改)

{
"from": 0,
"size": 20,
"query": {
    "filtered": {
        "query": {
            "bool": {
                "must": [
                    {
                        "match_phrase_prefix": {
                            "title": {
                                "query": "deli",
                                "max_expansions": 5
                            }
                        }
                    },
                    {
                        "match": {
                            "entity_type_id": 5
                        }
                    }
                ]
            }
        },
        "filter": {
            "and": {
                "filters": [
                    {
                        "nested": {
                            "path": "features",
                            "query": {
                                "bool": {
                                    "must": [
                                        {
                                            "match": {
                                                "features.id": 31
                                            }
                                        },
                                        {
                                            "match": {
                                                "features.value_int": {
                                                    "query": [
                                                        56, 57
                                                    ],
                                                    "operator": "and"
                                                }
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    }
                ]
            }
        }
    }
}

}

谢谢。

2 个答案:

答案 0 :(得分:1)

嵌套文档更难查询。这应该是你想要的:

{
  "query": {
    "filtered": {
      "filter": {
        "and": {
          "filters": [
            {
              "nested": {
                "path": "features",
                "query": {
                  "term": {
                    "features.id": {
                      "value": "1"
                    }
                  }
                }
              }
            },
            {
              "nested": {
                "path": "features",
                "query": {
                  "term": {
                    "features.id": {
                      "value": "9"
                    }
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}

答案 1 :(得分:1)

match查询支持布尔operator参数。您还应该在nested查询中包装查询,因为映射中的features字段为nested

尝试此查询:

{
   "query": {
      "nested": {
         "query": {
            "match": {
               "features.id": {
                 "query": "1 9",
                 "operator": "and"
               }
            }
         },
         "path": "features"
      }
   }
}