我正在构建一个应用程序,它使用solr来匹配更长的查询(通常是完整的句子),而索引文档几乎总是更短(搜索术语)。因此,我的查询看起来像“我应该在房价低的时候买房子。我们2年前提交了BR。现在租房,有一些贷款债务”和我的索引文件就像“买房子”,“房子贷款利率“。
我认为正确的方法是使用带状疱疹,dismax解析器和高度提升的“pf”字段。所以,我有一个“普通”文本字段,kw_stopped(solr 3.4中的text_en),带有非常激进的禁用词列表,以及一个kw_phrases字段,意思是短语带状疱疹。它的定义如下:
<fieldType name="shingle" class="solr.TextField" positionIncrementGap="100">
<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.LowerCaseFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.ShingleFilterFactory" maxShingleSize="8" outputUnigrams="false"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.ShingleFilterFactory" maxShingleSize="8" outputUnigrams="false"/>
</analyzer>
</fieldType>
我的架构字段如下所示:
<field name="kw_stopped" type="text_en" indexed="true" omitNorms="True" />
<!-- keywords almost as is - to provide truer match for full phrases -->
<field name="kw_phrases" type="shingle" indexed="true" omitNorms="True" />
我的搜索处理程序配置是这样的:
<requestHandler name="edismax" class="solr.SearchHandler" default="true">
<lst name="defaults">
<str name="defType">edismax</str>
<str name="echoParams">explicit</str>
<float name="tie">0.1</float>
<str name="fl">
keywords
</str>
<str name="mm">1</str>
<str name="qf">
kw_stopped^1.0 kw_phrases^5.0
</str>
<str name="pf">
kw_phrases^50.0
</str>
<int name="ps">3</int>
<int name="qs">3</int>
<str name="q.alt">*:*</str>
</lst>
</requestHandler>
当我打开debugQuery时,我注意到“kw_phrases”从不匹配,除非查询和文档完全相同。解析查询还显示,查询中的每个标记化都显示为“kw_stopped”的单个DisjunctionMaxQuery子句,但所有的带状符都放在kw_phrases字段的一个巨大子句中。
我理解的差距在哪里?我怎样才能做到这一点?
谢谢! 维杰
答案 0 :(得分:4)
如果你使用长句来搜索较短的文件,你似乎没事。
当然,您需要一个漂亮的停用词过滤器列表,以防止索引和搜索时间内的一般术语匹配。