繁体   English   中英

Solr Dismax短语搜索

[英]solr dismax phrase search

我正在构建一个应用程序,该应用程序使用solr来将较长的查询(通常是完整的句子)与几乎总是较短的索引文档(搜索词)进行匹配。 因此,我的查询看起来像“我应该在低利率的情况下现在买房子吗。我们在2年前提交了BR。现在要租,有一些sch贷款债务”,索引文件就像“买房子”,“房子”贷款利率”。

我认为正确的方法是使用带状疱疹,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” 从不匹配,除非查询和文档完全相同。 parsedquery还显示,查询中每个标记化的词都显示为“ kw_stopped”的单个DisjunctionMaxQuery子句,但所有带状疱疹都放置在kw_phrases字段的一个巨子句中。

我的理解力在哪里? 我该如何进行这项工作?

谢谢! 维杰

如果您使用长句子搜索较短的文档,那么您似乎还不错。

  • 使用Edismax查询解析器
  • 使用mm值到非常低的值或0% ,以便行为与OR相同,即任何单词。 您可以更改它以匹配至少2个或3个单词,以防止返回与单个单词匹配的单词。
  • 这将允许您控制如何匹配搜索字符串中的术语以使文档返回。
  • 使用pf(短语字段)来匹配具有完全匹配项的更高文档。
  • 代替显式的带状疱疹过滤器,可以使用pf2和pf3(带状短语字段)字段来匹配具有两个或三个单词组合的带状疱疹匹配的较高文档。
  • 使用ps(短语斜率)值为短语匹配提供足够的斜率值。

当然,您将需要一个不错的停用词过滤器列表,以防止在索引和搜索期间通用术语匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM