我有一个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>
答案 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>
答案 2 :(得分:1)
我已尝试过您发布的两个fieldTypes,并在Solr管理页面附带的分析页面上检查它们。两者似乎都没问题 - 看看下面。浅灰色表示产生匹配。
这让我有些困惑。有几个原因,但为什么你没有得到一个打击: