Solr 不突出显示某些单词

Posted

技术标签:

【中文标题】Solr 不突出显示某些单词【英文标题】:Solr does not highlight some words 【发布时间】:2016-01-19 01:53:05 【问题描述】:

我用highlighting functionality 配置了solr 4.10(也是5.3)。它适用于大多数单词,但是我发现一些“不允许”允许突出显示的单词,即 solr 返回所需的文档,但不突出显示其中的一些。

什么会导致这种影响?

solrconfig.xml

 <requestHandler name="/select" class="solr.SearchHandler">
 <lst name="defaults">
   <str name="wt">json</str>
   <str name="indent">true</str>
   <str name="defType">edismax</str>
   <str name="bf">product(concount)</str>
   <str name="df">text bio text_syn text_syn_other</str>
   <str name="qf">
    text^25 bio^16 text_syn^8 text_syn_other^3
   </str>
   <str name="hl">on</str>
   <str name="hl.fl">text bio text_syn text_syn_other</str>
   <str name="hl.preserveMulti">true</str>
   <str name="hl.encoder">html</str>
   <str name="f.text.hl.fragsize">100</str>
   <str name="hl.snippets">20</str>
   <arr name="components">
     <str>highlight</str>
   </arr>
 </lst>

schema.xml

    <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EnglishPossessiveFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms_abbr.txt" ignoreCase="true" expand="false"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EnglishPossessiveFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
</fieldType>

<fieldType name="text_en_syn" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EnglishPossessiveFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EnglishPossessiveFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
</fieldType>

<fieldType name="text_en_syn_other" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EnglishPossessiveFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms_other.txt" ignoreCase="true" expand="false"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EnglishPossessiveFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
</fieldType>

<field name="text" type="text_en" indexed="true" stored="true" multiValued="false" />
<field name="text_syn" type="text_en_syn" indexed="true" stored="false" multiValued="true" />
<field name="text_syn_other" type="text_en_syn_other" indexed="true" stored="false" multiValued="true" />

<field name="text_exact" type="string" indexed="true" stored="false" multiValued="false" />

<field name="bio" type="text_en" indexed="true" stored="true" multiValued="false" />

<field name="bio_exact" type="string" indexed="true" stored="false" multiValued="false" />

<field name="concount" type="long" indexed="true" stored="true" multiValued="false" />

<field name="concount_exact" type="long" indexed="true" stored="false" multiValued="false" />

<copyField source="text" dest="text_syn"/>
<copyField source="bio" dest="text_syn"/>
<copyField source="text" dest="text_syn_other"/>
<copyField source="bio" dest="text_syn_other"/>

对于查询 http://localhost:8983/solr/select?q=senior,我得到了包含单词 senior 的文档,但在 solr 响应的突出显示部分中,该单词未突出显示。


更新 1: 我发现我的synonyms_abbr.txt 文件中有senior 这个词,senior,lead 行。当我评论那行或替换单词的位置时,lead,senior,令人惊讶的是,senior 开始突出显示。有什么想法吗?


更新 2: 来自synonyms.txtsynonyms_other.txt 的单词会正常突出显示,但来自synonyms_abbr.txt 的单词会出现如下奇怪的行为。例如,我在synonyms_abbr.txt 中有行lead,head,senior 然后

查询http://localhost:8983/solr/select?q=seniorhttp://localhost:8983/solr/select?q=head 没有突出显示任何单词, 查询http://localhost:8983/solr/select?q=lead 不仅突出显示单词lead,还突出显示headsenior

【问题讨论】:

请使用 Solr 后端功能来分析单词的转换。我不确定这个词的转换方式。这可能是一个阻塞问题。否则,请使用不同的字段,关闭仅保留标记器的转换,然后尝试从该字段突出显示。 @Mher 是没有突出显示停用词的词吗?还是只是随机的? 我没有任何停用词配置。整个stopwords.txt 文件都被注释了。 你试过expand=true吗? 【参考方案1】:

从您的 update2 中可以清楚地看出,只有 lead,head,senior 中的第一个词实际上用于同义词匹配和突出显示。

如果您查看 SolrWiki 上的文档 https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters,会提到 expand=true 具有一定的效果

synonyms 参数命名定义同义词的外部文件。 如果 ignoreCase 为真,则在检查相等性之前匹配将小写。 如果 expand 为真,同义词将扩展为所有等效的同义词。如果为 false,则所有等效的同义词将减少到列表中的第一个

该网站还提供和示例

# If expand==true, "ipod, i-pod, i pod" is equivalent to the explicit mapping:
ipod, i-pod, i pod => ipod, i-pod, i pod
# If expand==false, "ipod, i-pod, i pod" is equivalent to the explicit mapping:
ipod, i-pod, i pod => ipod

这似乎与您观察到的行为一致。 这意味着您应该更改 schema.xml 中的同义词过滤器定义以使用 expand=true 或 更改同义词文件定义过滤器的方式以使用显式映射。

此外,由于分析器在索引时工作,您可能需要重新索引文档才能使其正常工作。

【讨论】:

感谢您的解释,这很有帮助,您能否解释一下问题的另一部分:例如我们有expand=true,为什么当我从@987654326 查询同义词时@ 文件然后该词的所有同义词以及其自身都会被突出显示,但是当从 synonyms.txt 中选择同义词时,突出显示只会获得该词,而不是该词的同义词? 查看您的字段定义,链接到 synonym.txt 的字段似乎配置为 store=false。因此突出显示将不起作用。请参阅 ilinca 对此问题的其他回复【参考方案2】:

您能否尝试在 synonyms_abbr.txt 文件中添加高级、铅和铅,高级,然后尝试运行荧光笔

【讨论】:

【参考方案3】:

部分字段未存储,因此无法返回。由于它们已编入索引,因此它们是可搜索的。将您的架构更改为已为您要突出显示的所有字段存储 =“true”。

<field name="text_syn" type="text_en_syn" indexed="true" stored="true" multiValued="true" />
<field name="text_syn_other" type="text_en_syn_other" indexed="true" stored="true" multiValued="true" />

通过查看您的配置,我推测在 bio 和 text 字段上突出显示作品?

【讨论】:

没有@linca,突出显示不适用于生物和文本字段。我不考虑未存储的文件。 哦,对不起。 text bio text_syn text_syn_other 这行让我觉得你也想在 2 个未存储的字段上突出显示。我想我们需要一个字段值、查询、结果的示例。

以上是关于Solr 不突出显示某些单词的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Solr HighlightPage 不返回突出显示的信息

使用 ffmpeg drawtext 突出显示文本中的一些单词

solr:突出显示:hl.simple.pre/post 有时不会出现

Solr突出显示多个术语

无法获得突出显示的 Solr 响应

ShingleFilterFactory 影响 Solr 中突出显示部分的大小