【问题标题】:NEST (ElasticSearch) matching Highlights to documentsNEST (ElasticSearch) 将 Highlights 匹配到文档
【发布时间】: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 项目?

【问题讨论】:

    标签: elasticsearch highlight nest


    【解决方案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 仅在第一次命中后返回更多。还有其他要求吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多