English 中文(简体)
Elasticsearch 查询构建器匹配多个术语
原标题:Elasticsearch QueryBuilder Match Multiple Terms

在ES指数中以下列格式给予 JSON:

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

以下获取匹配 id 字段的文档 :

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

相反,我试图匹配多个字段,即( place.lat , place.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();
最佳回答

默认情况下,一个地理点字段不是作为两个字段(位置.lat和位置.lon)索引的,而是作为包含纬度和经度的单一字段索引的。

您可以打开 lat_lon < a href=> 映射选项 ,打开纬度和经度的索引。但是,在您的例子中,纬度和经度的值太大。因此,它们被正常化,转换为-840.和-69.0,而不是456和-789。 因此,如果您能够启用 lat_l 并替换查询中的值,您应该能够获得结果。

请注意,纬度和经度的值在索引前被转换为双倍。因此,使用术语查询从长远看可能并不十分实用,因为从长远看,你必须始终考虑到四舍五入的错误。使用range查询或弹性查询