到目前为止,我遵循this guide来使本地java脚本与elasticsearch一起使用。使用doc().field("fieldname")
访问普通的非嵌套字段可以正常工作。
嵌套字段的工作方式是否相同?如何循环它们并访问嵌套字段?
编辑:在阅读下面的imotov回答后,我最终使用include_in_root
或include_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();
}
答案 0 :(得分:4)
这很难。嵌套对象在内部作为单独的文档编制索引,因此顶级custom_filters_score在根对象上运行,并且无法访问嵌套对象。但是你可以做一些事情。
我认为最好的选择是将custom_filters_score移动到嵌套过滤器中,脚本将在嵌套对象上运行。请参阅Elastic search - tagging strength (nested/child document boosting)作为示例。
第二个选项是在嵌套对象映射上将include_in_root
设置为true。这样,所有嵌套对象字段也将在根对象中编入索引,您将能够使用点表示法访问它们:places.location
,就像没有嵌套一样。此选项的问题是您必须将字段索引两次,并且您将不知道哪个嵌套对象与嵌套查询匹配。
第三个选项是从源检索嵌套对象字段。如果您的搜索产生大量结果,这将非常缓慢并且不适用。