如何在RavenDB v4中获取查询匹配文本?附旧版本实现示例
在RavenDB v4中实现查询匹配文本高亮的方法
在RavenDB 4.x及后续版本中,查询高亮功能的API进行了重构,不再使用旧版本的FieldHighlightings类和out参数模式,而是通过更直观的方式获取高亮结果。以下是和你原有代码逻辑对齐的实现示例:
基于DocumentQuery的实现
// 执行查询并配置高亮 var hits = session .Advanced .DocumentQuery<FAOCRPage>("Standard/Lucene") .Statistics(out var stats) .Highlight(x => x.OCR, 50, 5) // 指定高亮字段、单片段长度、最大片段数量 .SetHighlighterTags("**", "**") // 设置高亮前后标签,和旧版本用法一致 .Skip(pageNum * pageSize) .Take(pageSize) .Search(x => x.OCR, queryStr, escapeQueryOptions: EscapeQueryOptions.RawQuery) .ToList(); // 获取所有高亮结果 var highlightings = session.Advanced.GetHighlightings(); // 遍历结果,提取每个文档的匹配片段 foreach (var hit in hits) { // 根据文档ID和字段名获取对应的高亮片段 string[] fragments = highlightings.GetFragments(hit.Id, nameof(FAOCRPage.OCR)); // 这里可以对fragments进行后续处理,比如展示给用户 }
基于LINQ Query的实现(可选)
如果你更习惯使用LINQ风格的查询,也可以这样写:
var query = session.Query<FAOCRPage>("Standard/Lucene") .Statistics(out var stats) .Highlight(x => x.OCR, 50, 5, tags: ("**", "**")) // 直接在Highlight方法中指定标签 .Skip(pageNum * pageSize) .Take(pageSize) .Search(x => x.OCR, queryStr, escapeQueryOptions: EscapeQueryOptions.RawQuery); var hits = query.ToList(); var highlightings = session.Advanced.GetHighlightings(); // 同样的方式提取片段 foreach (var hit in hits) { var fragments = highlightings.GetFragments(hit.Id, nameof(FAOCRPage.OCR)); }
关键变化说明
- 不再需要通过
out参数传递FieldHighlightings对象,查询执行后通过session.Advanced.GetHighlightings()统一获取所有高亮数据 - 使用
GetFragments方法,通过文档ID和字段名称来精准获取对应文档的匹配片段 - 高亮标签的配置可以通过
SetHighlighterTags(DocumentQuery)或者Highlight方法的tags参数(LINQ Query)来设置,逻辑和旧版本一致 - 如果需要对多个字段开启高亮,只需多次调用
Highlight方法即可,后续分别获取对应字段的片段即可
内容的提问来源于stack exchange,提问作者user7064696
相关产品推荐
相关产品推荐

