2013-04-03 40 views
3

到目前为止,我遵循this guide来获取使用elasticsearch的本机java脚本。使用doc().field("fieldname")可以正常访问正常的非嵌套字段。在java中访问嵌套的elasticsearch字段

对嵌套字段做同样的工作吗?我如何循环它们并访问嵌套字段?

编辑:阅读imotov的回答下面我结束了包括使用include_in_rootinclude_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(); 
} 
+0

对不起...你在问什么? – gparyani

+0

如何访问[嵌套字段](http://www.elasticsearch.org/guide/reference/mapping/nested-type/)?查看[this](http://www.spacevatican.org/2012/5/12/elasticsearch-native-scripts-for-dummies/)了解非嵌套字段。 – sqwk

+0

它取决于脚本的类型及其运行位置。它是script_field,sort_script,filter_script等?你能提供使用你的本地脚本的查询吗? – imotov

回答

4

这是艰难的。嵌套对象在内部作为单独文档建立索引,所以顶层custom_filters_score在根对象上运行,并且无法访问嵌套对象。但是你可以做一些事情。

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

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

第三个选项是从源检索嵌套的对象字段。如果你的搜索产生了很多结果,这将会非常慢,并且不适用。