索尔没有强调一些词

时间:2015-10-20 11:59:18

标签: solr highlight

我使用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: 我发现我的senior文件synonyms_abbr.txt中有senior,lead字样。当我评论该行或替换了单词的位置lead,senior时,令人惊讶的是senior这个词开始突出显示。有什么想法吗?

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

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

3 个答案:

答案 0 :(得分:2)

某些字段未存储,因此无法返回。由于它们被索引,因此可以搜索。将架构更改为已存储=&#34; true&#34;对于要突出显示的所有字段。

<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的作品吗?

答案 1 :(得分:2)

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

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

synonyms参数指定定义同义词的外部文件。 如果ignoreCase为true,则在检查相等性之前匹配将为小写。 如果展开为true,则同义词将扩展为所有等效的同义词。如果为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 OR 更改您的同义词文件定义过滤器以使用显式映射的方式。

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

答案 2 :(得分:0)

您可以尝试将senior,lead和lead,senior添加到文件synonyms_abbr.txt中,然后尝试运行荧光笔