给定 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();
最佳答案
默认情况下,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 可能更有用。
关于java - Elasticsearch QueryBuilder 匹配多个术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10773581/