我们正在尝试对文本文件的内容执行基于solr的搜索,并且要求尝试返回每个文档中搜索词的所有匹配以及命中周围的突出显示文本。
我们可以在文档中的搜索词的第一个匹配处返回找到的文档数以及突出显示的代码段。但是不会返回找到搜索词的文档中的突出显示列表。我们可以将TermFrequency报告为正确的数字,但不是所有这些事件的片段。
solr架构的相关部分:
<field name="Content" type="text_general" indexed="false" stored="true" required="true"/>
<field name="ContentSearch" type="text_general" indexed="true" stored="false" multiValued="true"/>
<copyField source="Content" dest="ContentSearch"/>
例如,如果我们有索引的a.txt和b.pdf,以及搜索词 “case”在两个文档中都存在多次(a.txt - 7次点击,b.pdf - 10 点击),当对这两个文件执行搜索“案例”时,我们是 使用正确的术语频率(7和9)返回两个文档,但突出显示列表只包含一个记录,该记录对应于文件中的第一个匹配。
这与使用TermVectorComponent作为内容字段有关。我已阅读但无法完全了解TVC的工作方式,以及在哪种情况下它有用。
答案 0 :(得分:2)
这是由于突出显示的默认设置。为了达到您的目的,我建议您更改snippets和maxAnalyzedChars选项。默认情况下,片段设置为仅返回一个片段,而maxAnalyzedChars仅查看前51200个字符。我会将这些值设置为snippets=20
(或某些值大于预期的最大片段数)和maxAnalyzedChars=100000
(或大于最长字段值的其他值),这将确保整个值为分析并返回所有亮点。
注意:您可能还需要使用fragsize设置来获取片段的相应大小(以包括突出显示的词之前和之后的行)。由于片段的默认大小为100个字符。
在SolrNet中,您需要在传递给查询的Snippets
上设置MaxAnalyzedChars
和HighlightingParameters
属性。类似于以下内容:
var results = solr.Query(new SolrQueryByField("ContentSearch", "case"),
new QueryOptions {
Highlight = new HighlightingParameters {
Fields = new[] {"ContentSearch"},
Snippets = 20,
MaxAnalyzedChars = 100000,
}
});