java - Elasticsearch java 客户端搜索嵌套字段不起作用

标签 java json elasticsearch

我能够使用 java api 成功创建索引并搜索源字段。我的问题是无法使用搜索获取嵌套键字段。

例如我的示例 json 结构:

{
    "name":         "John Smith",
    "age":          42,
    "confirmed":    true,
    "join_date":    "2014-06-01",
    "timestamp": "14331222299",
    "home": {
        "lat":      51.5,
        "lon":      0.1
    },
    "accounts": [
        {
            "type": "facebook",
            "id":   "johnsmith"
        },
        {
            "type": "twitter",
            "id":   "johnsmith"
        }
    ]
}

我可以通过java客户端api将此json索引为源:-

 IndexResponse response = client.prepareIndex(mohan+"-"+14-10-2014, "mohanelastic")
                    .setSource(jsonoutput.toString())
                    .execute()
                    .actionGet();

我的java客户端搜索API:

   QueryBuilder en = QueryBuilders.matchQuery("name", "John Smith");

FilterBuilder flb = FilterBuilders.andFilter(
                            FilterBuilders
                        .              .rangeFilter("timestamp").from(starttimeinmilli).to(endtimeinmilli),
                                                            FilterBuilders.queryFilter(QueryBuilders.matchQuery("confirmed", "true"))
                            );
            SearchResponse response = client.prepareSearch(mohan+"-"+14-10-2014)        
            .setTypes("mohanelastic")
            .setSearchType(SearchType.QUERY_AND_FETCH)
            .setPostFilter(flb)
            .setQuery(en)
            .setFrom(0).setSize(60)
            .execute().actionGet();

在这里我可以获得总点击数、关键字段值(姓名、年龄、加入日期)。但无法获取 (home.lat) 的键值,它显示空值。任何 json 的嵌套值都显示为 null。

我正在检索源字段 json 键,它显示相应的值:-

System.out.println("event type"+response.getHits().getAt(0).getSource().get("name"));
System.out.println("event type"+response.getHits().getAt(0).getSource().get("timestamp"));

但是当我尝试 home.lat 时它显示空值:

System.out.println("event type"+response.getHits().getAt(0).getSource().get("home.lat"));

最佳答案

您无法在 Java API 中使用点表示法访问 home.lat 值。将嵌套对象视为 map (home) 或包含 map 的列表 (accounts)。要获取 lat 值,您需要执行以下操作:

Map<String, Object> source = response.getHits().getAt(0).getSource();
Map<String, Object> home = source.get('home');
Double latValue = (Double) home.get('lat');

关于java - Elasticsearch java 客户端搜索嵌套字段不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26367884/

相关文章:

java - java中的集合框架需要什么?

java - 如何从 Firebase 获取数组列表对象

mysql - 如何使用 xml/json 将主数据库 (MySQL) 与多个从数据库同步

mysql - 非规范化与子/父和嵌套

elasticsearch - 是否可以取消删除 Elasticsearch 中的文档?

java - 在 ArrayList 中搜索

java - JSplitPane 不绘画更正

php - 从 mysql 检索数据返回相同的 3 行

python - 使用 python 验证 JSON 数据

datetime - Elasticsearch 日期格式