我有一个包含元素的弹性搜索索引,它将嵌套的子元素作为属性,例如。
{
_index: tests,
_type: test,
_id: 11021,
_version: 1,
_score: 1,
_source: {
id: 11021,
name: "demotest",
responsiblePerson: {
userId: "221",
userName: "Walter",
userSurName: "White",
userEmail: "Walter.White@lospollos.com"
},
listOfSubItems: [{"name": "location"},{"name":"sample"},{"name":"experiment"}]
}
}
现在,我想在查询结果中明确包含一些字段(例如,从结果中排除listOfSubitems以减小它的大小;这也是我不想再回到原因的原因_source属性)。
java API的代码是:
SearchResponse responseTests = client.prepareSearch("tests")
.addField("id")
.addField("name")
.addField("responsiblePerson")
.setQuery(QueryBuilders.matchQuery("id", testId))
.execute()
.actionGet();
SearchHits testHits = responseTests.getHits();
不幸的是,由于testHits.getTotalHits()显示的是一个数字,但testHits.getHits()。的长度为 0 :此查询不起作用: - (
是否有人暗示我如何才能让它发挥作用?
答案 0 :(得分:2)
"您无法获取嵌套对象的存储字段值的原因是因为它存储在单独的Lucene文档中。
如果在映射中启用了嵌套,则单个ES文档将存储为单独的Lucene文档。每个嵌套对象都是一个Lucene文档。主/根文档也将是一个单独的Lucene文档。 ES将始终将匹配转换回根Lucene文档。 _source始终与根Lucene文档相关联。在获取字段时,已经发生了对Lucene根文档的转换,因此无法访问嵌套的存储字段,但访问_source中的值将起作用。
我不认为这是一个错误,而是ES当前如何使用嵌套文档的限制。一旦实现了#3022,就可以访问嵌套的Lucene文档的存储字段。"
你可以在https://github.com/elasticsearch/elasticsearch/issues/5245
找到它