我遇到了solr结果的问题,我想我会在这里提出建议。
我通过在查询和索引级别包含<filter class="solr.PhoneticFilterFactory" encoder="RefinedSoundex" inject="true"/>
来启用语音匹配,同时也使用编码器DoubleMetaphone
作为变体。
这里的问题是solr只返回语音匹配的结果,而忽略了通配符匹配或几乎完全匹配的搜索短语。
示例:
在我的索引中,我有一个名为'name'的字段和值'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字段只有name字段的确切值,它不存储我想要搜索的语音代码。
我发现了这个solr-boosting-down-phonetic-variations,但没有太多细节。
由于 P
答案 0 :(得分:3)
当我输入mod
作为查询时,我终于开始工作了,我得到了大约5个相关结果,包括modenine
。我如何设法做到这一点是通过使用Ngram过滤器,这不是我刚刚发现的东西,事实上,我已经从一开始就将Ngram过滤器添加到schema.xml中的过滤器列表中,但从未真正按预期工作。
错误在于我在index
和query
级/阶段应用NgramFilter。
Ngram只应在index
阶段添加,在查询阶段删除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>
干杯
Babajide
答案 1 :(得分:1)
您没有获得通配符匹配,因为您没有执行通配符搜索。 name:mode*
将匹配“modenine”,虽然它不会在语音上匹配,因为未分析通配符/前缀搜索,这是有道理的,因为语音算法的工作假设他们正在使用完整的单词。
如果要同时搜索两者,则应使用以下查询:name:mode name:mode*
。