Solr不突出显示某些词

问题描述:

我配置了solr 4.10(也5.3)和highlighting functionality。它可以很好地处理大多数单词,但是我找到了一些“不会”字样的字样,即solr会返回所需的文档,但不会突出显示其中的一些。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。当我评论那条线或者替换单词的地方时,令人惊讶的是senior这个单词开始突出显示。有任何想法吗 ?


更新2:从synonyms.txtsynonyms_other.txt 词越来越突出正常,但从synonyms_abbr.txt词语运行异常如下。举例来说,我也行lead,head,seniorsynonyms_abbr.txt然后

  • 查询http://localhost:8983/solr/select?q=seniorhttp://localhost:8983/solr/select?q=head不突出任何文字,
  • 查询http://localhost:8983/solr/select?q=lead亮点不仅字lead,也headsenior
+0

请使用Solr后端功能来分析单词的转换。我不确定这个词的转换方式。这可能是一个棘手的问题。否则,使用不同的字段,关闭转换只留下标记器,然后尝试从该字段突出显示。 – 0xCAFEBABE

+0

@Mher是否突出显示停用词?或者只是随机? –

+0

我没有任何停用词配置。整个'stopwords.txt'文件被评论。 – Mher

从你UPDATE2很显然,只在lead,head,senior的第一个词是实际用于同义词匹配和突出显示。

如果你看一下在SolrWiki https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters文档存在具有一定的效果

的同义词参数名外部文件中定义的同义词的expand=true提。 如果ignoreCase为true,则在检查相等之前匹配将小写。 如果扩展为真,则同义词将扩展为所有等同的同义词。如果它是错误的,所有等同的同义词将被缩减到列表中的第一个。

该网站还介绍和例子

# 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或更改同义词文件定义过滤器以使用显式映射的方式。

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

+0

感谢您的解释,这是非常有用的,你能解释一个问题的其他部分:例如,我们有'expand = true',为什么当我从同义词word_abbr.txt文件中查询时,该词的所有同义词都在突出显示以及本身,但是wehen从'synonyms .txt'中选择同义词,然后突出显示只获取该词,而不是该词的同义词? – Mher

+0

看看你的字段定义,看起来链接到synonym.txt的字段是用store = false配置的。因此突出显示不起作用。请参阅ilinca对此问题的其他回复 – vvs

某些字段没有存储,因此无法返回。由于它们被编入索引,因此可以搜索。将您的模式更改为您想要突出显示的所有字段的stored =“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" /> 

通过查看您的配置,我认为突出显示在字段生物和文本的作品?

+0

没有@linca,突出显示不适用于字段生物和文本。我不考虑没有存储的文件。 – Mher

+0

哦,对不起。行文本生物text_syn text_syn_other让我觉得你想在2未存储的领域的亮点。我想我们需要一个字段的值,查询,结果的例子。 – ilinca

你能尝试高级,铅和铅,资深添加到文件synonyms_abbr.txt然后再尝试运行荧光笔