我希望通过搜索I.B.M.
来确保搜索ibm
。我还想确保通过搜索Dismemberment Plan
找到dismember
。
使用Solr,我可以在分析和查询时使用哪些标记器和过滤器来允许这两种结果?
答案 0 :(得分:9)
对于I.B.M. => IBM
你需要一个solr。WordDelimiterFilterFactory,它会删除特殊的字符并附加单词和数字
catenateWords =“1”将连接这些词并将I.B.M转换为IBM。
肢解=>肢解
需要包含一个词干分析器(例如solr.PorterStemFilterFactory,solr.EnglishMinimalStemFilterFactory),它将索引词的根并为具有相同词根的词提供匹配。
此外,您可以将solr.LowerCaseFilterFactory用于不区分大小写的匹配项(IBM和ibm),使用solr.ASCIIFoldingFilterFactory处理外来字符。
您始终可以使用SynonymFilterFactory来映射您认为是同义词的单词。
您可以在查询和索引时应用此选项,以便它们在两者中匹配和转换,并且结果是一致的。
e.g。字段类型def -
<fieldType name="text_en_splitting" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
<!-- Index and Query time -->
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<!-- Stemmer -->
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>