9

给定 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.lat, location.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

4 回答 4

4

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

您可以通过打开lat_lon 映射选项来打开纬度和经度的索引。但是,在您的示例中,纬度和经度的值太大。因此,它们被标准化、转换为双精度并索引为 -84.0 和 -69.0 而不是 456 和 -789。因此,如果您将启用lat_lon并替换查询中的值,您应该能够获得结果。

请注意,纬度和经度的值在索引之前会转换为双精度值。因此,从长远来看,使用术语查询可能不太实用,因为您必须始终考虑舍入误差。改用范围查询或弹性搜索地理空间查询可能更有用。

于 2012-05-29T16:05:41.630 回答
1

查看 ElasticSearch 中的bool 查询,您应该能够指定must,shouldshould_not为您的查询获取和/或的适当混合。

于 2012-05-28T02:30:42.107 回答
0
QueryBuilder qb = boolQuery()
    .must(termsQuery("content", Arrays.asList("test1", "test4"))); 

https://www.elastic.co/guide/en/elasticsearch/guide/current/_finding_multiple_exact_values.html

于 2017-07-24T11:00:26.997 回答
-1

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

于 2015-02-10T21:57:49.407 回答