Выделение Elasticsearch вложенными объектами

У меня вопрос о выделении полей вложенных объектов.

рассмотрим запись следующим образом:

_source: {

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

}

если перевод.значение имеет фильтр ngram, можно ли выделить совпадения во вложенном объекте, таком как этот? И как будет выглядеть запрос highlight.

большое спасибо за ответ.

2 ответов


та же проблема здесь. Кажется, что теперь есть способ сделать это в эластичном поиске и не будет в ближайшем будущем.

разработчик Шей Банон написал:

чтобы сделать выделение на основе вложенного запроса, вложенный документы также должны быть извлечены, чтобы выделить его, что более проблематично (и менее эффективным).

и:

его объяснение было что это займет хороший объем памяти, как может быть большое количество детей. И это выглядит подлинным для меня, как добавление этой функции нарушит только базовую концепцию обработки 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');
            }
        });

надеюсь, это немного поможет.


вы можете использовать force_source": true в полях, чтобы вызвать выделение документа после объединения вложенных полей.