Solr搜索在某些字符上失败

时间:2015-09-03 19:20:37

标签: solr

我有一个Solr集合,它不会返回一些非ASCII字符的结果。我们使用的示例是字符串S11. • “≡ «Ñaïvétý» ‘¢¥£’ ¶!#%;搜索整个字符串不会返回任何结果,即使我在索引字段中有一个对象。但是,搜索该字符串的子字符串会返回匹配项。导致Solr不返回匹配项的唯一字符是中间的三个:• “≡。该字段被编入索引为text_en,但我也尝试了edge_ngram(希望有一点Cargo Cult魔法可以解决问题)。这三个字符有什么特别之处,还是我需要调整Solr索引字段的方法?

我们正在通过django-haystack搜索,但问题也出现在Solr管理员中。

以下是两种字段类型定义:

<fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1">
    <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.WordDelimiterFilterFactory"        
            generateWordParts="1" generateNumberParts="1" catenateWords="0" 
            catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
        <filter class="solr.EdgeNGramFilterFactory" 
            minGramSize="2" maxGramSize="50" side="front" />
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.WordDelimiterFilterFactory" 
            generateWordParts="1" generateNumberParts="1" catenateWords="0" 
            catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
    </analyzer>
</fieldType>

<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="lang/stopwords_en.txt"
                enablePositionIncrements="true"
                />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <filter class="solr.PorterStemFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" 
            ignoreCase="true" expand="true"/>
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="lang/stopwords_en.txt"
                enablePositionIncrements="true"
                />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <filter class="solr.PorterStemFilterFactory"/>
    </analyzer>
</fieldType>

3 个答案:

答案 0 :(得分:2)

您是否尝试过使用ASCIIFoldingFilterFactory

  

转换字母,数字和符号Unicode字符   不在前127个ASCII字符中(“Basic Latin”Unicode   阻止)到它们的ASCII等价物(如果存在)。

<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false"/>

答案 1 :(得分:1)

你可以尝试一下......

<fieldType name="text_reference" class="solr.TextField" sortMissingLast="true" omitNorms="true" positionIncrementGap="100">
       <analyzer type="index">
         <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="50" side="front"/>
            <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="50" side="back"/>
       </analyzer>
       <analyzer type="query">
          <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
       </analyzer>
    </fieldType>

enter image description here

答案 2 :(得分:1)

我已尝试过您发布的两个fieldTypes,并在Solr管理页面附带的分析页面上检查它们。两者似乎都没问题 - 看看下面。浅灰色表示产生匹配。

这让我有些困惑。有几个原因,但为什么你没有得到一个打击:

  • 您更改了schema.xml 没有重建索引,这将会运行,但不会生成点击
  • 您正在使用dismax / edismax queryhandler,其中MM参数定义为不利的值。
    • 您可以在solrconfig.xml
    • 中查找
    • 但是这只是默认值,从代码发送请求时可能会更改参数。
  • 在索引编制过程中涉及的三个文件中有一些有趣的值,即
    • 郎/ stopwords_en.txt
    • protwords.txt
    • synonyms.txt

text_en的结果 enter image description here

edge_ngram的结果 enter image description here