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

时间:2015-01-12 09:37:55

标签: java elasticsearch

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

{
    _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 :此查询不起作用: - (

是否有人暗示我如何才能让它发挥作用?

1 个答案:

答案 0 :(得分:2)

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

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

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

你可以在https://github.com/elasticsearch/elasticsearch/issues/5245

找到它