1

我将 C# NEST 与 ElasticSearch 一起使用。我能够查询Products的索引并在它们的NameCategoryName字段中查找匹配项。我还可以使用扩展查询Highlights

现在在我的IQueryResponse回复中,我有两个集合: (1).Documents和 (2) .Highlights

例如:考虑搜索:“cat”,它有 3 个文档结果:

{
   { 名称:“猫产品”,类别名称:“Category1”},
   {名称:“某些产品”,类别名称:“Category2”},
   {名称:“某些产品2”,类别名称:“Category3”}
}

但现在我有 4 个突出显示的结果:

{
   { 字段:“名称”,亮点:['“<u>猫</u>产品”'] },
   { 字段:“categoryName”,亮点:['"<u>Cat</u>egory1"'] },
   { 字段:“categoryName”,亮点:['"<u>Cat</u>egory2"'] },
   { 字段:“categoryName”,亮点:['"<u>Cat</u>egory3"'] }
}

它们之间似乎没有任何关系。我如何知道哪个Highlight项目属于哪个Document项目?

4

2 回答 2

3

IQueryResponse还公开.DocumentsWithMetaData类型IEnumerable<IHit<T>>,其中 T 是文档的类型

这基本上是结果的展开视图,因为 elasticsearch 返回IHit<T>具有许多有用的属性,例如Highlights.

我已将 DocumentId 结果添加到突出显示类Highlight,这样无论您如何获得突出显示,您都可以轻松地将其与命中相关联。

所以.DocumentsWithMetaData现在使用,下一个版本将有一个更合乎逻辑的高亮 API。

于 2013-07-25T11:22:43.910 回答
0

这是版本 7.x 的更新答案。您像以前一样收到两个集合, .Documents 和 .Hits 。在 .Hits 中,每个都有一个 .Id 与 elasticsearch 中索引的 _id 匹配。注意:如果您在查询中请求多个突出显示的 .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();
                                }
                           }
                   }
             }
      }
}
于 2020-03-25T13:52:30.507 回答