使用Solr 5.4在语音上搜索邮政编码

时间:2016-01-28 05:43:55

标签: solr n-gram postal-code phonetics

使用Solr 5.4,我试图以语音方式索引和搜索邮政编码。我尝试过组合NGramFilterFactory和BeiderMorseFilterFactory,但似乎没有用。例如,我想存储和索引" AB11 9RD"并搜索" a B 11 nine Rd"。我在这里发布我们的schema.xml。任何实施技巧都将非常感激。

<types>
    <fieldType name="string" class="solr.StrField"/>
    <fieldType name="postcode" class="solr.TextField" omitNorms="true">
        <analyzer>
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <tokenizer class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="1"/>
        </analyzer>
    </fieldType>
    <fieldType name="postcode_phonetic" class="solr.TextField" omitNorms="true">
        <analyzer>
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <tokenizer class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="1"/>
            <filter class="solr.UpperCaseFilterFactory"/>
            <filter class="solr.BeiderMorseFilterFactory" nameType="GENERIC" ruleType="APPROX" concat="true" languageSet="auto"/>
        </analyzer>
    </fieldType>

<fields>
    <copyField source="Postcode" dest="PostcodePhonetic"/>
    <field name="Postcode"  type="postcode" indexed="true"  stored="true" multiValued="true"/>
    <field name="PostcodePhonetic"  type="postcode_phonetic" indexed="true" stored="false" multiValued="true"/>
    <field name="PostcodePhonetic2"  type="postcode_phonetic2" indexed="true" stored="false" multiValued="true"/>

2 个答案:

答案 0 :(得分:0)

这不是语音搜索的意思 - 语音搜索会将单词转换为他们的语音&#34;语音&#34;表示,其中语音表示只是意味着类似的声音名称转换为相同的标记。一个例子是&#34;九&#34;和&#34; nhine&#34;在这种情况下。

<tokenizer class="solr.NGramTokenizerFactory" minGramSize="1" maxGramSize="1" />与同义词过滤器一起使用,其中每个数字都有一个同义词作为其文本形式。如果你使用更大的maxGramSize,你也可以转换&#34; 11&#34;进入&#34;十一&#34;同样。

答案 1 :(得分:0)

以下是解决方案的更新。如果有人可以提出更好的解决方案,请

<analyzer type="index">
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\b \b" replacement=""/>
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt"/>
    <filter class="solr.ShingleFilterFactory" tokenSeparator="" minShingleSize="2" maxShingleSize="7" outputUnigrams="false"/>
    <filter class="solr.LengthFilterFactory" min="6" max="7"/>
  </analyzer>
</fieldType>