我对solr的结果有一个问题,我想我应该在这里寻求建议。
我已经启用了语音匹配,包括<filter class="solr.PhoneticFilterFactory" encoder="RefinedSoundex" inject="true"/>在查询和索引级别,也与编码器DoubleMetaphone作为一个变体。
这里的问题是solr只返回语音匹配的结果,而忽略通配符匹配或几乎精确的搜索短语匹配。
示例:
在我的索引中,我有一个名为'name‘和value 'Modenine’字段的文档,当我搜索name:mod时,我得到了一个"Modenine“,这是可以的,
但是当我使用name:mode搜索时,请注意额外的'e',它返回'Something Foul Mouth',这是因为,mouth语音匹配mode,因此我不介意使用“臭嘴”,但我也想看到'Modenine‘,因为mode是实际的搜索词。
在我看来,最快的解决方案是在索引过程中添加语音代码到索引中,然后使用dismax对结果进行排序,例如使用^2.0提供分数。
我有以下内容:字段声明
<field name="phoneticName" type="phonetics" indexed="true" stored="true"/>
<field name="name" type="phonetics" indexed="true" stored="true"/> 语音学FieldType
<fieldType name="phonetics" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<filter class="solr.LowerCaseFilterFactory"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.PhoneticFilterFactory" encoder="RefinedSoundex" inject="true"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PhoneticFilterFactory" encoder="RefinedSoundex" inject="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>但是在重新索引之后,phoneticName字段只有名称字段的确切值,它不存储我搜索的语音代码。
我找到了这个solr-boosting-down-phonetic-variations,但是没有太多的细节。
谢谢P
发布于 2013-11-16 20:58:32
当我输入mod作为查询时,我终于开始工作了,我得到了大约5个相关的结果,包括modenine。我如何做到这一点是通过使用Ngram过滤器--这不是我刚刚发现的,事实上,我从一开始就将Ngram过滤器添加到schema.xml中的过滤器列表中,但从未像预期的那样工作过。
错误在于,我同时在index和query级别/阶段应用了query。只能在index阶段添加Ngram,在查询阶段删除Ngram文件后,我得到了所需的结果。
请参阅下面的配置,注意我如何添加:solr.RemoveDuplicatesTokenFilterFactory以从NGramFilterFactory筛选器中删除可能的重复项。
<fieldType name="phonetics" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<filter class="solr.TrimFilterFactory"/>
<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="1000" />
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="1000" />
<filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="1" splitOnNumerics="0"
generateWordParts="1" stemEnglishPossessive="0" generateNumberParts="0"
catenateWords="1" catenateNumbers="0" catenateAll="0" preserveOriginal="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.DoubleMetaphoneFilterFactory" inject="true"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<filter class="solr.TrimFilterFactory"/>
<filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="1" splitOnNumerics="0"
generateWordParts="1" stemEnglishPossessive="0" generateNumberParts="0"
catenateWords="1" catenateNumbers="0" catenateAll="0" preserveOriginal="1"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.DoubleMetaphoneFilterFactory" inject="true"/>
</analyzer>
</fieldType>干杯
巴巴吉德
发布于 2013-11-15 16:32:56
您没有得到通配符匹配,因为您没有执行通配符搜索。name:mode*将匹配"modenine",尽管它不会在语音上匹配,因为通配符/前缀搜索不会被分析,这是有意义的,因为语音算法的工作假设它们使用的是一个完整的单词。
如果您想在这两个方面都进行搜索,则应该使用类似于:name:mode name:mode*的查询。
https://stackoverflow.com/questions/20003225
复制相似问题