我为正在编制索引的关键字字段启用了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。
我尝试使用查询分析器显示上述每个查询的匹配术语,但我没有看到匹配的文档在结果中返回。有没有办法可以返回所有具有相应分数的文件,无论它们是否是正面匹配,以便更好地理解它们为什么不被退回?
答案 0 :(得分:1)
首先,您应该在查询时删除NGramFilterFactory。你真的不需要编写查询的ngram,这可能会搞砸你的结果。另外,您是否可能仅查看前十个结果? Solr使用默认的rows=10
参数;您可以使用start
参数增加或切换页面。查看随查询一起返回的numFound
,其中包含结果总数,即使您没有看到所有结果。