我目前正在使用solr edismax在我们的网站上进行搜索。我想做的基本上是使破折号被忽略。
因此,如果我搜索“ wi-fi适配器”一词。我有一个标题为“ wifi adapter”的文档。我没有结果。
我当前正在使用solr.MappingCharFilterFactory将破折号映射到空格。这就是我的模式中text_general字段类型的样子。
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.ClassicTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
<charFilter class="solr.HTMLStripCharFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.ClassicTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping.txt"/>
<filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
<charFilter class="solr.HTMLStripCharFilterFactory"/>
</analyzer>
</fieldType>
我的mapping.txt包含该行。
"-" => " "
因此,此规则的作用是将破折号转换为空格。
因此,如果我搜索“无线适配器”,它将始终显示与“无线适配器”相同的结果,但不会显示“无线适配器”的结果。
有没有办法像这样处理破折号?本质上,我想将“ wifi适配器”,“ wi-fi适配器”和“ wi fi适配器”相同。
-保罗
答案 0 :(得分:3)
您可以将WordDelimiterGraphFilterFactory
用于分析仪。它具有许多可以使用的属性。我列出了一些。
WordDelimiterGraphFilterFactory
具有许多属性。
generateWordParts
:(整数,默认为1)如果非零,则在定界符处分割单词。例如:"CamelCase", "hot-spot" → "Camel", "Case", "hot", "spot"
preserveOriginal
:(整数,默认为0)如果非零,则保留原始令牌:"Zap-Master-9000" → "Zap-Master-9000", "Zap", "Master", "9000"
catenateWords
:(整数,默认为0)如果非零,则将加入最大部分的单词部分:"hot-spot-sensor’s" → "hotspotsensor"
因此,您的情况就像
<fieldType name="text_wd" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<!-- Splits words based on whitespace characters -->
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<!-- splits words at delimiters based on different arguments -->
<filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="1" catenateWords="1"/>
<!-- Transforms text to lower case -->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
有关更多信息,请访问Fiters available in solr