NEST (ElasticSearch) сопоставление Highlights с документами

Я использую C# NEST с ElasticSearch. Я могу запросить индекс Products и найти совпадения в их полях Name и CategoryName. Я также могу расширить запрос, используя Highlights.

Теперь в моем ответе IQueryResponse у меня есть две коллекции: (1) .Documents и (2) .Highlights.

например: рассмотрите поиск: «кошка», который имеет 3 результата документа:

{
   { Name: "Cat product", CategoryName: "Category1" },
   { Name: "Some product", CategoryName: "Category2" },
   { Name: "Some product2", CategoryName: "Category3" }
}

Но теперь у меня есть 4 основных результата:

{
   { Field: "name", Highlights: ['"<u>Cat</u> product"'] },
   { Field: "categoryName", Highlights: ['"<u>Cat</u>egory1"'] },
   { Field: "categoryName", Highlights: ['"<u>Cat</u>egory2"'] },
   { Field: "categoryName", Highlights: ['"<u>Cat</u>egory3"'] }
}

Кажется, что они никак не связаны друг с другом. Как узнать, какой элемент Highlight относится к какому элементу Document?


person ReFocus    schedule 23.07.2013    source источник


Ответы (2)


IQueryResponse также предоставляет .DocumentsWithMetaData типа IEnumerable<IHit<T>>, где T — тип вашего документа.

По сути, это развернутое представление результатов, так как возврат elasticsearch IHit<T> имеет много полезных свойств, таких как Highlights.

Я добавил результат DocumentId в класс выделения Highlight, так что независимо от того, как вы добираетесь до выделения, вы можете легко связать его с попаданием.

Так что пока используйте .DocumentsWithMetaData, в следующем релизе будет более логичный API для подсветки.

person Martijn Laarman    schedule 25.07.2013
comment
Я уже пытался повторить свойство .Hits, но это было невозможно. Затем я нашел свойство .DocumentsWithMetaData, в котором было то, что мне было нужно! Спасибо. - person ReFocus; 26.07.2013
comment
@Martijn Laarman У вас есть пример того, как этого можно добиться с помощью версии 7.x? Это будет высоко ценится. - person CShark; 22.01.2020

вот обновленный ответ для версии 7.x. Вы получаете две коллекции, как и прежде, .Documents и .Hits . Внутри .Hits у каждого есть .Id, который соответствует _id индекса в elasticsearch. Примечание. Если вы запрашиваете более одного выделения .NumberofFragments в своем запросе, вы просто будете перезаписывать result.title и result.content в приведенном ниже коде, поэтому используйте это как свободный пример, чтобы показать, как вы можете сопоставить результат выделения с правильный результат документа, а затем перезапишите поле документа полем, содержащим выделение.

if (response.Documents.Count > 0)
{
    foreach (MyResultClass result in response.Documents) //cycle through your results
    {
         foreach (var hit in response.Hits) // cycle through your hits to look for match
         {
              if (hit.Id == result.id) //you found the hit that matches your document
              {
                    foreach (var highlightField in hit.Highlight)
                    {
                           if (highlightField.Key == "title")
                           {
                                foreach (var highlight in highlightField.Value)
                                {
                                    result.title = highlight.ToString();
                                }
                           }
                           else if (highlightField.Key == "content")
                           {
                                foreach (var highlight in highlightField.Value)
                                {
                                    result.content = highlight.ToString();
                                }
                           }
                   }
             }
      }
}
person canadian beaver    schedule 25.03.2020
comment
highlight.Value не содержит всего значения поля, оно содержит только значение, начинающееся с первого попадания. Установка fragmentSize = 20 000 возвращает больше только после первого попадания. Требуется ли что-то еще? - person john nowlin; 03.12.2020