Solr查询语法完全匹配

时间:2013-06-26 09:44:38

标签: solr lucene

我的字段配置为

    <fieldType name="gtext" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <!--Needed for efficient trailling wildcard queries-->
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" side="front"/>
    <filter class="solr.ReversedWildcardFilterFactory" withOriginal="true"
         maxPosAsterisk="2" maxPosQuestion="1" minTrailing="2" maxFractionAsterisk="0"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.WordDelimiterFilterFactory"
            generateWordParts="1"
            generateNumberParts="1"
            catenateWords="0"
            catenateNumbers="1"
            stemEnglishPossessive="1"               
            catenateAll="0"
            preserveOriginal="1"
            />
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.WordDelimiterFilterFactory"
                generateWordParts="1"
                generateNumberParts="1"
                catenateWords="0"
                catenateNumbers="1"
                stemEnglishPossessive="1"               
                catenateAll="0"
                preserveOriginal="1"
                />
    </analyzer>
</fieldType>

因此,当我搜索示例 fun 时,它也会返回搞笑。我怎样才能避免这种行为,只有乐趣匹配?是因为反向通配符吗?

1 个答案:

答案 0 :(得分:2)

这是EdgeNGramFilterFactory过滤器的原因

<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" side="front"/>

EdgeNGramFilterFactory为令牌生成边缘克数,例如

funny会生成 - &gt; f, fu, fun, funn, funny .....

因此,当您搜索fun时,funny的文档会匹配

ReversedWildcardFilterFactory不会导致此问题,它只会增强前缀查询搜索。

例如funny将存储为ynnuf

前缀查询*nny将转换为ynn*,这对性能更有利。