solr filter或tokenizer来组合单词

时间:2011-09-26 21:02:26

标签: solr

我正在尝试使用一系列过滤器来实现合理的名称建议功能。目前我有

        <fieldType name="suggester" class="solr.TextField" positionIncrementGap="1" autoGeneratePhraseQueries="true">
        <analyzer type="index">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
                    catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
            <filter class="solr.ASCIIFoldingFilterFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.ShingleFilterFactory" outputUnigramsIfNoShingles="true" maxShingleSize="2"
                    outputUnigrams="true"/>
            <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
                    catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
            <filter class="solr.ASCIIFoldingFilterFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.ShingleFilterFactory" outputUnigramsIfNoShingles="true" maxShingleSize="2"
                    outputUnigrams="true"/>
            <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15"/>
        </analyzer>
    </fieldType>

这当然需要更多的调整,但我在这个问题的一个特定方面。对于输入字符串mark daniel sievers,上述内容将匹配marksievers上的查询,但我真正想要的是减少EdgeNGramFilter的详细程度,因为它会导致匹配过度使用可以某种可配置方式组合单词的过滤器/标记器,例如输入mark daniel rex sievers创建标记mark sieversmark daniel sieversmark rex sievers等。我没有应用任何特定的算法,但我想知道这样的野兽是否存在(几乎可以肯定)或最好将我自己编写为过滤插件?

Solr 3.3.0

1 个答案:

答案 0 :(得分:5)

我使用的是ShingleFilter:http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.ShingleFilterFactory

例如:

<filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true"/>

输入:mark daniel sievers

代币生成:mark, mark daniel, mark daniel sievers, daniel, daniel sievers, sievers