【问题标题】:Solr NGram filtering not matching search termSolr NGram 过滤不匹配搜索词
【发布时间】:2012-10-07 21:03:19
【问题描述】:

我为我正在索引的关键字字段启用了 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.com, 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 的文档。

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

【问题讨论】:

    标签: solr


    【解决方案1】:

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

    【讨论】:

    • 我重新阅读了 Apache Solr 3 Enterprise Search 一书中关于 N-Gram 过滤的部分,该部分证实了您关于仅在索引时应用 N-Gram 过滤的评论。出于测试目的,我的索引中只有 1 个文档,并且 rows 参数在这种情况下不相关。 explain other 参数可能有助于返回我的文档并检查每个不同查询字符串的评分。
    • 答案很准确。删除 N-Gram 查询分析器后,我现在可以按预期返回每个子字符串查询的结果。
    猜你喜欢
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多