java - Elasticsearch QueryBuilder 匹配多个术语

标签 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();

最佳答案

默认情况下,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/

相关文章:

elasticsearch - Elasticsearch所有索引的计数

java - 从n个列表中获取交集

java - Hbase 批量加载附加数据而不是覆盖它们

elasticsearch - Elasticsearch edge_ngram问题?

elasticsearch - elasticsearch查询字符串格式

elasticsearch - 当查询包含 “IN”前缀时,为什么 Elasticsearch 不返回结果?

Java 命令模式与 iPhone 委托(delegate)模式

java - 什么是 LinkedHashMap 以及它的用途是什么?

java - jackson 在 momentJS 中使用的奇怪时间戳值给出了错误的年份

node.js - 将 elasticsearch & cassandra 与 postgres 数据库同步