我能够使用 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/