Solr语音匹配与实际文本字段

时间:2013-11-15 14:23:49

标签: solr lucene

我遇到了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

2 个答案:

答案 0 :(得分:3)

当我输入mod作为查询时,我终于开始工作了,我得到了大约5个相关结果,包括modenine。我如何设法做到这一点是通过使用Ngram过滤器,这不是我刚刚发现的东西,事实上,我已经从一开始就将Ngram过滤器添加到schema.xml中的过滤器列表中,但从未真正按预期工作。

错误在于我在indexquery级/阶段应用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*