ElasticSearch:在搜索结果中包含内部对象

ElasticSearch: Include inner object in search result

我有一个弹性搜索索引,其中包含具有嵌套子元素作为属性的元素,例如。

{
    _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().length 是 0 : -(

有人能告诉我如何让它工作吗?

"您无法获取嵌套对象的存储字段值的原因是它存储在单独的 Lucene 文档中。

如果在映射中启用嵌套,则单个 ES 文档将存储为单独的 Lucene 文档。每个嵌套对象都是一个 Lucene 文档。主/根文件也将是一个单独的 Lucene 文件。 ES 总是会将匹配项翻译回根 Lucene 文档。 _source 始终与根 Lucene 文档相关联。当获取字段时,已经发生了到 Lucene 根文档的转换,因此无法访问嵌套的存储字段,但可以访问 _source 中的值。

我不认为这是一个错误,而是 ES 当前如何处理嵌套文档的限制。一旦实施了#3022,就可以访问嵌套 Lucene 文档的存储字段。"

你可以在这里找到它https://github.com/elasticsearch/elasticsearch/issues/5245