Elasticsearch QueryBuilder匹配多个术语

时间:2012-05-27 11:21:09

标签: java elasticsearch

以下列格式给出ES索引中的JSON:

{
    "pin": {
        "id": 123,
        "location": {
            "lat": 456,
            "lon":-789
        }
    }
}

以下内容使文档与id字段匹配:

client.prepareSearch("index_name")
        .setTypes("pin")
        .setQuery(QueryBuilders.termQuery("id", 123))
        .execute()
        .actionGet();

相反,我试图匹配多个字段,即。 (location.latlocation.lon)。

QueryBuilders.termQuery(); // accepts only a single term

尝试了一些替代方案,但似乎都没有,例如:

QueryBuilder queryBuilder = QueryBuilders.boolQuery()
        .must(QueryBuilders.termQuery("location.lat", 456))
        .must(QueryBuilders.termQuery("location.lon", -789));

client.prepareSearch("index_name")
        .setTypes("pin")
        .setQuery(queryBuilder)
        .execute()
        .actionGet();

4 个答案:

答案 0 :(得分:4)

默认情况下,geo_point字段未编入索引为两个字段(location.lat和location.lon),它被编入索引为包含纬度和经度的单个字段。

您可以打开lat_lon mapping option来启用纬度和经度的索引编制。但是,在您的示例中,纬度和经度的值太大。因此,它们被标准化,转换为double并索引为-84.0和-69.0而不是456和-789。因此,如果您启用lat_lon并替换查询中的值,您应该能够获得结果。

请注意,在编制索引之前,纬度和经度的值会转换为double。因此,从长远来看,使用术语查询可能不太实用,因为您必须始终考虑舍入误差。使用range queries或elasticsearch geospatial queries可能更有用。

答案 1 :(得分:1)

查看ElasticSearch中的bool query,您应该可以指定mustshouldshould_not来获取和/或查询的适当组合。

答案 2 :(得分:0)

您可以使用QueryBuilders.multiMatchQuery而不是QueryBuilders.termQuery

答案 3 :(得分:-1)