Elasticsearch突出显示嵌套对象

smo*_*nar 7 elasticsearch tire

我有一个关于突出显示嵌套对象字段的问题.

考虑这样的记录:

_source: {

    id: 286
    translations: [
        {
            id: 568
            language: lang1
            value: foo1 bar1
        }
        {
            id: 569
            language: lang2
            value: foo2 bar2
        }
    ]

}
Run Code Online (Sandbox Code Playgroud)

如果translations.value有ngram过滤器,是否可以突出显示嵌套对象中的匹配项?突出显示查询将如何显示.

非常感谢您的回复.

tea*_*ano 3

这里同样的问题。似乎现在有办法在弹性搜索中做到这一点,但在不久的将来不会。

开发者 Shay Banon 写道

为了基于嵌套查询进行突出显示,还需要提取嵌套文档以突出显示它,这会产生更多问题(并且性能较低)。

他的解释是,这需要大量的内存,因为可能有大量的孩子。在我看来,它看起来很真实,因为添加此功能将违反一次仅处理 N 个提要的基本概念。

因此,唯一的方法是在您自己的程序中手动处理查询结果以添加突出显示。

更新

我不知道 tire 或 ngram 过滤器,但我找到了一种通过使用嵌套构面和构面过滤器来检索与嵌套文档匹配的所有过滤器的方法。您需要一个单独的查询来突出显示,但它比浏览 _source 快得多,至少在我的情况下是这样。

{"query":
    {"match_all":{}},
    "facets":{
        "matching_translations":{
            "nested":"translations",
            "terms":{"field":"translations.value"},
            "facet_filter":{
                "bool":{"must":[{"terms":{"translations.value":["foo1"]}}]}
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用生成的方面术语在程序中突出显示。

例如:我想突出显示嵌套文档的链接(在 jquery 中):

 setHighlights = function(sdata){
        var highlightDocs = [];
        if(sdata['facets'] && sdata['facets']['docIDs'] && sdata['facets']['doctIDs']['terms'] && sdata['facets']['docIDs']['terms'].length >0){
            for(var i in sdata['facets']['docIDs']['terms']){
                highlightDocs.push(sdata['facets']['docIDs']['terms'][i]['term'])
            }
        }
        $('li.document_link').each(function(){
            if($.inArray($(this).attr('id'),highlightDocs) != -1) {
                $(this).addClass('document_selected');
            }
        });
Run Code Online (Sandbox Code Playgroud)

我希望这会有所帮助。