nest(elasticsearch)7.x highlights collection hits.highlight.value不返回整个字段

iszxjhcz  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(0)|浏览(220)

要突出显示nest elasticsearch结果中的文本。利用nest(elasticsearch)中匹配突出显示到文档的以下代码,我发现hits.highlight.value并不包含整个字段。
例如,搜索结果有大约1200个字符的响应。hits.hightlight.value在搜索到的文本之前包含一些文本,这些文本被正确标记,然后是fragmentsize属性的剩余部分。不幸的是,它不是从文本字段的开头开始的。因此,用highlight.value替换结果不起作用。
是否有其他属性或元数据允许我替换文档中的值?

{
    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();
                                }
                           }
                   }
             }
      }
}

更新
最后加上这个来处理这种情况。我觉得应该有更好的方法,但这是可行的。

private static void markHighlightedText(ISearchResponse<SearchObject> results)
{
    Dictionary<string, string[]> hits = results.Hits
        .Select(hit => new
        {
            Id = hit.Id,
            Values = hit.Highlight
                .SelectMany(h => h.Value, (highlight, values) => new { highlight, values })
                .Where(h => h.highlight.Key == "text") // only highlighting .Text field
                .Select(h => h.values)
                .ToArray()
        })
        .ToDictionary(k => k.Id, v => v.Values);

    foreach (var document in results.Documents)
    {
        if (hits.TryGetValue(document.Id.ToString(), out string[] highlightedValues))
        {
            foreach (var value in highlightedValues)
            {
                var unhighlightedValue = value.Replace(preTag, "").Replace(postTag, "");
                document.Text = document.Text.Replace(unhighlightedValue, value);
            }
        }
    }
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题