我正在尝试使用Java API实现弹性搜索的内部命中,但我找不到任何关于它的文档或其他人正在使用的示例。我的JSON搜索工作方式如下:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"nested": {
"path": "locations",
"filter": {
"geo_distance": {
"distance": "20km",
"locations.address.geoLocation": {
"lat": 38.07061,
"lon": -76.77514
}
}
},
"inner_hits": {}
}
}
}
}
}
我在elasticsearch库中看到了InnerHitsBuilder和addInnerHit方法,但我找不到有关如何使用它们的文档。
答案 0 :(得分:7)
请注意,ES源代码中有大量测试用例正在测试每个功能,因此浏览ES代码是一个非常丰富的信息来源。内部命中也不例外,您可以在InnerHitsTests.java
类中找到所有inner_hits
个测试用例。
因此,您的上述查询可以像这样创建:
// build the geo_distance filter
GeoDistanceFilterBuilder geo = FilterBuilders
.geoDistanceFilter("locations.address.geoLocation")
.distance("20km")
.lat(38.07061)
.lon(-76.77514);
// build the nested filter and add inner_hits
NestedFilterBuilder nested = FilterBuilders
.nestedFilter("locations", geo)
.innerHit(new QueryInnerHitBuilder()); <--- this is what you're looking for
// wrap it all inside a filtered query
FilteredQueryBuilder query = QueryBuilders
.filteredQuery(QueryBuilders.matchAllQuery(), nested);