Elasticsearch QueryBuilder匹配多个术语

ahm*_*yha 8 java elasticsearch

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

{
    "pin": {
        "id": 123,
        "location": {
            "lat": 456,
            "lon":-789
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

client.prepareSearch("index_name")
        .setTypes("pin")
        .setQuery(QueryBuilders.termQuery("id", 123))
        .execute()
        .actionGet();
Run Code Online (Sandbox Code Playgroud)

相反,我正在尝试匹配多个字段,即.(location.lat,location.lon).

QueryBuilders.termQuery(); // accepts only a single term
Run Code Online (Sandbox Code Playgroud)

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

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();
Run Code Online (Sandbox Code Playgroud)

imo*_*tov 4

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

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

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