7

ネストされたオブジェクト フィールドの強調表示について質問があります。

次のようなレコードを検討してください。

_source: {

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

}

translations.value に ngram フィルターがある場合、このようなネストされたオブジェクトで一致を強調表示することは可能ですか? そして、ハイライト クエリはどのようになりますか。

返信ありがとうございます。

4

2 に答える 2

3

ここでも同じ問題。弾性検索でそれを行う方法があり、近い将来にはないようです。

開発者のシェイ・バノンは次のように書いています。

ネストされたクエリに基づいて強調表示を行うには、ネストされたドキュメントを抽出して強調表示する必要がありますが、これはより問題があります (そしてパフォーマンスが低下します)。

また

彼の説明は、多数の子が存在する可能性があるため、これにはかなりの量のメモリが必要になるというものでした。この機能を追加すると、一度に N 個のフィードのみを処理するという基本概念に違反するため、私には本物のように見えます。

したがって、唯一の方法は、独自のプログラムでクエリの結果を手動で処理してハイライトを追加することです。

アップデート

タイヤまたは ngram フィルターについてはわかりませんが、ネストされたファセットとファセット フィルターを使用して、フィルターに一致するネストされたドキュメントをすべて取得する方法を見つけました。強調表示には別のクエリが必要ですが、少なくとも私の場合は、_source を参照するよりもはるかに高速です。

{"query":
    {"match_all":{}},
    "facets":{
        "matching_translations":{
            "nested":"translations",
            "terms":{"field":"translations.value"},
            "facet_filter":{
                "bool":{"must":[{"terms":{"translations.value":["foo1"]}}]}
            }
        }
    }
}

結果のファセット用語を使用して、プログラムで強調表示できます。

例: ネストされたドキュメントへのリンクを強調表示したい (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');
            }
        });

それが少し役立つことを願っています。

于 2013-03-22T13:05:00.817 に答える
-1

フィールドで force_source" : true を使用すると、ネストされたフィールドが結合されたときにドキュメントが強調表示されます。

于 2014-03-29T23:46:28.410 に答える