Solr NGram过滤不匹配搜索词

时间:2012-10-07 21:03:19

标签: solr

我为正在编制索引的关键字字段启用了NGram过滤,其中包含以下以逗号分隔的字词:

wwwdebenhams.com,ebenhams.com,dbenhams.com,deenhams.com,debnhams.com,debehams.com,debenams.com,debenhms.com,debenhas.com,debenham.com,debenhams.ocm,debenhams.con ,debenhams.comn,debenhams.copm,debenhams.comm,debenhams.coom,debenhams.xom,debenhams.cpm,ebenhams.com,dbenhams.com,deenhams.com,debnhams.com,debehams.com,debenams.com,debenhms .com,debenhas.com,debenham.com,

核心架构如下所示:

<?xml version="1.0" ?>

<schema name="merchant" version="1.0">
    <types>
    <!--
          Default numeric field types. For faster range queries, consider the           tint/tfloat/tlong/tdouble types.
        -->
        <fieldType name="int" class="solr.TrieIntField" precisionStep="0"     positionIncrementGap="0"/>

        <fieldType name="text_lowercase_ngram" class="solr.TextField"     termPositions="false" omitNorms="true">
        <analyzer type="index">
               <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.WordDelimiterFilterFactory"
                    splitOnCaseChange="0"
                    splitOnNumerics="0"
                    stemEnglishPossessive="0"
                    generateWordParts="1"
                    generateNumberParts="1"
                    catenateWords="0"
                    catenateNumbers="0"
                    catenateAll="0"
                    preserveOriginal="1"
                    types="wdfftypes.txt"
                    />
            <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="20"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.WordDelimiterFilterFactory"
                    splitOnCaseChange="0"
                    splitOnNumerics="0"
                    stemEnglishPossessive="0"
                    generateWordParts="1"
                    generateNumberParts="1"
                    catenateWords="0"
                    catenateNumbers="0"
                    catenateAll="0"
                    preserveOriginal="1"
                    types="wdfftypes.txt"
                    />
            <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="20"/>
        </analyzer>
    </fieldType>

    <fieldType name="text_exact" class="solr.TextField">
        <analyzer>
            <tokenizer class="solr.KeywordTokenizerFactory"/>
        </analyzer>
    </fieldType>
</types>

<fields>
    <!-- Merchant Fields -->
    <field name="id" type="int" indexed="true" stored="true" required="true"/>
    <field name="site_id" type="int" indexed="true" stored="true" required="true"/>
    <field name="title" type="text_lowercase_ngram" indexed="true" stored="true"/>
    <field name="url" type="text_exact" indexed="true" stored="true"/>
    <field name="keywords" type="text_lowercase_ngram" indexed="true" stored="true" />
    <field name="description" type="text_lowercase_ngram" indexed="true" stored="true" />
    <field name="type" type="int" indexed="true" stored="true"/>
    <field name="popularity" type="int" indexed="true" stored="true"/>
    <field name="category" type="text_exact" indexed="true" stored="true" multiValued="true"/>
</fields>

<!-- field to use to determine and enforce document uniqueness. -->
<uniqueKey>id</uniqueKey>

<!-- field for the QueryParser to use when an explicit fieldname is absent -->
<defaultSearchField>title</defaultSearchField>

<!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
<solrQueryParser defaultOperator="OR"/>

搜索'deb'会返回匹配的文档,评分为6.4406505。搜索'debe','deben','debenh'和'debenha'不会返回任何结果。搜索'debenham'会返回匹配的文档,得分为41.740173,'debenhams'返回的文档得分为111.30711。

我尝试使用查询分析器显示上述每个查询的匹配术语,但我没有看到匹配的文档在结果中返回。有没有办法可以返回所有具有相应分数的文件,无论它们是否是正面匹配,以便更好地理解它们为什么不被退回?

1 个答案:

答案 0 :(得分:1)

首先,您应该在查询时删除NGramFilterFactory。你真的不需要编写查询的ngram,这可能会搞砸你的结果。另外,您是否可能仅查看前十个结果? Solr使用默认的rows=10参数;您可以使用start参数增加或切换页面。查看随查询一起返回的numFound,其中包含结果总数,即使您没有看到所有结果。