Выделение 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 в полях, чтобы вызвать выделение документа после объединения вложенных полей.