簡體   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