3

到目前为止,我按照本指南获取了与 elasticsearch 一起使用的原生 java 脚本。使用 . 访问普通的非嵌套字段可以正常工作doc().field("fieldname")

嵌套字段也一样吗?如何遍历它们并访问嵌套字段?

编辑:在阅读了下面 imotov 的答案后,我最终使用include_in_rootor将嵌套字段包含在根文档中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();
}
4

1 回答 1

4

这是一个艰难的。嵌套对象在内部作为单独的文档进行索引,因此顶级 custom_filters_score 对根对象进行操作,并且无权访问嵌套对象。但是你可以做一些事情。

我认为最好的选择是将 custom_filters_score 移动到嵌套过滤器中,您的脚本将在嵌套对象上运行。请参阅弹性搜索 - 标记强度(嵌套/子文档提升)作为示例。

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

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

于 2013-04-08T16:40:56.417 回答