首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >solr dismax短语搜索

solr dismax短语搜索
EN

Stack Overflow用户
提问于 2011-10-20 19:43:05
回答 1查看 3.1K关注 0票数 2

我正在构建一个应用程序,它使用solr将较长的查询(通常是完整的句子)与索引文档匹配,而索引文档几乎总是较短的(搜索词)。所以,我的问题看上去像是“我现在应该在利率低的时候买房子吗?我们两年前就申请了BR。现在付房租,还有一些sch贷款债务”,而我的索引文件是“买房”,“房屋贷款利率”。

我认为正确的方法是使用shingles ( dismax解析器)和高度增强的"pf“字段。因此,我有一个“普通”文本字段,kw_stopped (Solr3.4中的text_en)和一个非常具有攻击性的词组列表,以及一个kw_phrases字段,意思是短语shingles。其定义如下:

代码语言:javascript
复制
<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>

我的模式字段如下所示:

代码语言:javascript
复制
<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" />

我的搜索处理程序配置如下:

代码语言:javascript
复制
<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“的单个kw_stopped子句,但是对于kw_phrases字段,所有的标记都放在一个巨大的子句中。

在我的理解中,差距在哪里?我怎么才能把这事做好?

谢谢!维杰

EN

回答 1

Stack Overflow用户

发布于 2011-10-21 06:06:16

如果你用长句来搜索较短的文档,你看起来会很好。

  • 使用Edismax查询解析器
  • 使用毫米值至极低值或0%,使行为与OR相同,即任何单词。您可以将其更改为至少匹配2或3个单词,以防止返回单个单词匹配的单词。
  • 这将允许您控制如何匹配搜索字符串中的术语以使文档返回。
  • 使用pf (短语字段)来匹配具有精确匹配的更高的文档。
  • 与显式带状筛选器不同,使用pf2和pf3 (带状短语字段)字段来匹配更高的文档,这些文档对于两个或三个单词组合具有显式匹配。
  • 使用ps (短语slop)值为短语匹配提供足够的slop值。

当然,您需要一个很好的停止词筛选列表来防止索引和搜索时间中的一般术语匹配。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7841338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档