到目前为止,我按照 this guide 获取了与 elasticsearch 一起使用的 native java 脚本。使用 doc().field("fieldname")
可以正常访问正常的非嵌套字段。
嵌套字段是否同样有效?我如何遍历它们并访问嵌套字段?
编辑:阅读下面 imotov 的回答后,我最终使用 include_in_root
或 include_in_parent
在根文档中包含嵌套字段(参见 docs) .
GeoPoint[] locations = ((GeoPointDocFieldData)doc().field("places.location")).getValues();
for (GeoPoint location : locations) {
// Do Stuff
double lat = location.lat();
double lon = location.lon();
}
最佳答案
这是一个艰难的过程。嵌套对象在内部作为单独的文档进行索引,因此顶级 custom_filters_score 在根对象上运行并且无权访问嵌套对象。但是您可以做一些事情。
我认为最好的选择是将 custom_filters_score 移动到嵌套过滤器中,您的脚本将在嵌套对象上运行。参见 Elastic search - tagging strength (nested/child document boosting)举个例子。
第二个选项是将嵌套对象映射的 include_in_root
设置设置为 true。这样,所有嵌套对象字段也将在根对象中建立索引,并且您将能够使用点符号访问它们:places.location
,就好像没有嵌套一样。此选项的问题是您必须对字段进行两次索引,并且您不知道哪个嵌套对象与您的嵌套查询匹配。
第三个选项是从源中检索嵌套对象字段。如果您的搜索产生大量结果,这将非常缓慢且不适用。
关于java - 在java中访问嵌套的elasticsearch字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15778148/