访问java中的嵌套弹性搜索字段

时间:2013-04-03 03:00:53

标签: java nested elasticsearch

到目前为止,我遵循this guide来使本地java脚本与elasticsearch一起使用。使用doc().field("fieldname")访问普通的非嵌套字段可以正常工作。

嵌套字段的工作方式是否相同?如何循环它们并访问嵌套字段?

编辑:在阅读下面的imotov回答后,我最终使用include_in_rootinclude_in_parent在{<1}}中查看了根文档中的嵌套字段。(参见docs)。< / p>

GeoPoint[] locations = ((GeoPointDocFieldData)doc().field("places.location")).getValues();

for (GeoPoint location : locations) {
    // Do Stuff
    double lat = location.lat();
    double lon = location.lon();
}

1 个答案:

答案 0 :(得分:4)

这很难。嵌套对象在内部作为单独的文档编制索引,因此顶级custom_filters_score在根对象上运行,并且无法访问嵌套对象。但是你可以做一些事情。

我认为最好的选择是将custom_filters_score移动到嵌套过滤器中,脚本将在嵌套对象上运行。请参阅Elastic search - tagging strength (nested/child document boosting)作为示例。

第二个选项是在嵌套对象映射上将include_in_root设置为true。这样,所有嵌套对象字段也将在根对象中编入索引,您将能够使用点表示法访问它们:places.location,就像没有嵌套一样。此选项的问题是您必须将字段索引两次,并且您将不知道哪个嵌套对象与嵌套查询匹配。

第三个选项是从源检索嵌套对象字段。如果您的搜索产生大量结果,这将非常缓慢并且不适用。