要突出显示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);
}
}
}
}
暂无答案!
目前还没有任何答案,快来回答吧!