簡體   English   中英

如何配置 Solr 進行部分詞匹配

[英]How to configure Solr to do partial word matching

鑒於以下一組值,我如何配置字段以返回部分單詞匹配但也匹配整個搜索詞的值?

價值觀:

Texas State University
Stanford University
St. Johns College

期望結果示例:

搜索詞: sta

預期結果:

Texas State University
Stanford University

搜索詞: stan

預期結果:

Stanford University

搜索詞: st un

預期結果:

Texas State University
Stanford University

這是我迄今為止嘗試過的:

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" words="stopwords.txt"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
  </analyzer>
</fieldType>

我認為我的問題出在EdgeNGramFilterFactory 如上所示,對stan的第二次搜索返回顯示的所有三個值,而不是僅返回Stanford 但是,如果沒有EdgeNGramFilterFactory ,部分單詞根本不匹配。

Solr 字段返回部分單詞匹配但也匹配整個搜索詞的值的正確配置是什么?

我想我想通了。 不過,我絕對歡迎其他答案和其他更正。

解決方案似乎是只在索引時使用EdgeNGramFilterFactory ,而不是在查詢時。 當你考慮它時,這是有道理的。 我在索引時想要 n-gram,但只想在查詢時匹配實際的搜索詞。

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" words="stopwords.txt"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" words="stopwords.txt"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
</fieldType>

我有類似的要求並嘗試了這個......創建了不同的字段類型......

<fieldType name="text_reference" class="solr.TextField" sortMissingLast="true" omitNorms="true" positionIncrementGap="100">
      <analyzer type="index">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="50" side="front"/> 
      </analyzer>
      <analyzer type="query">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
  </fieldType>

我還有一個要求……下面的博客會詳細解釋

https://www.blogger.com/blogger.g?blogID=8592878860404675342#editor/target=post;postID=6309840933546641223;onPublishedMenu=allposts;onClosedMenu=allposts;postNum=33;src=postname

您可以使用

N-Gram 過濾器

生成給定范圍內大小的 n-gram 標記。 請注意,令牌按位置排序,然后按 gramize 排序。

工廠類:solr.NGramFilterFactory

參數:

minGramSize:(整數,默認 1)最小克大小。 maxGramSize:(整數,默認 2)最大克大小。

例子:

<analyzer>  
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.NGramFilterFactory"/>
</analyzer>

在:“四分”

輸出: "f", "o", "u", "r", "fo", "ou", "ur", "s", "c", "o", "r", "e", “sc”、“co”、“或”、“re”

http://archive.apache.org/dist/lucene/solr/ref-guide/apache-solr-ref-guide-5.3.pdf#page=112&zoom=auto,-187,475

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM