1

我们正在尝试对文本文件的内容执行基于 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 hits, b.pdf - 10 hits),当执行针对这两个文档搜索“案例”,我们将返回两个文档,并以正确的词频(7 和 9)返回,但突出显示列表仅包含一个记录,该记录对应于文件中的第一个命中。

这是否与将 TermVectorComponent 用于内容字段有关。我已阅读但无法完全弄清楚 TVC 的工作方式以及在何种情况下它会有所帮助。

4

1 回答 1

3

这是由于突出显示的默认设置。为了实现您想要的,我建议更改片段maxAnalyzedChars选项。默认情况下,片段设置为仅返回一个片段,并且 maxAnalyzedChars 将仅查看前 51200 个字符。我会将这些值设置为snippets=20 (或大于预期的最大片段数的值)和maxAnalyzedChars=100000(或大于最长字段值的其他值),这将确保分析整个值并返回所有亮点。

注意:您可能还需要使用fragsize设置来获得片段的适当大小(包括突出显示的单词之前和之后的行)。由于片段的默认大小为 100 个字符。

在 SolrNet 中,您需要设置传递给查询的SnippetsMaxAnalyzedChars属性。HighlightingParameters类似于以下内容:

   var results = solr.Query(new SolrQueryByField("ContentSearch", "case"), 
     new QueryOptions {
       Highlight = new HighlightingParameters {
          Fields = new[] {"ContentSearch"},
          Snippets = 20,
          MaxAnalyzedChars = 100000,
      }
   });
于 2013-01-31T12:36:04.447 回答