NEST (ElasticSearch) 将 Highlights 匹配到文档

Posted

技术标签:

【中文标题】NEST (ElasticSearch) 将 Highlights 匹配到文档【英文标题】:NEST (ElasticSearch) matching Highlights to documents 【发布时间】:2013-07-22 05:33:08 【问题描述】:

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

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

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

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

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

字段:“名称”,亮点:['“产品”'] , 字段:“categoryName”,亮点:['"Category1"'] , 字段:“categoryName”,亮点:['"Category2"'] , 字段:“categoryName”,亮点:['"Category3"']

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

我已经在尝试迭代 .Hits 属性,但这是不可能的。然后我找到了我需要的 .DocumentsWithMetaData 属性!谢谢。 @Martijn Laarman 您是否有示例说明如何使用 7.x 版实现这一目标?将不胜感激。【参考方案2】:

这里是 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();
                                
                           
                   
             
      

【讨论】:

highlight.Value 不包含整个字段值,它似乎只包含从第一次点击开始的值。设置 fragmentSize = 20,000 仅在第一次命中后返回更多。还有其他要求吗?

以上是关于NEST (ElasticSearch) 将 Highlights 匹配到文档的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 Nest 将查询列表传递给 ElasticSearch?

如何将单个 .NET 类型映射到 ElasticSearch/NEST 中的多个嵌套对象类型?

如何在 NEST 中禁用驼峰式 Elasticsearch 字段名称?

ElasticSearch NEST 搜索

如何使用NEST Bulk Api将文档添加到elasticsearch

Elastcisearch.Nest 7.x 系列`伪`官方翻译:通过 NEST 来快捷试用 Elasticsearch