如何配置Solr进行部分字匹配

And*_*bbs 10 lucene solr sunspot

给定以下一组值,如何配置字段以返回部分字匹配但也匹配整个搜索项的值?

价值观:

Texas State University
Stanford University
St. Johns College
Run Code Online (Sandbox Code Playgroud)

期望的结果示例:

搜索词: sta

期望的结果:

Texas State University
Stanford University
Run Code Online (Sandbox Code Playgroud)

搜索词: stan

期望的结果:

Stanford University
Run Code Online (Sandbox Code Playgroud)

搜索词: st un

期望的结果:

Texas State University
Stanford University
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所尝试的:

<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>
Run Code Online (Sandbox Code Playgroud)

我想我的问题在于EdgeNGramFilterFactory.如上所示,第二次搜索stan返回显示的所有三个值而不是仅显示Stanford.但是,如果没有EdgeNGramFilterFactory,部分词语根本不匹配.

Solr字段的正确配置是返回部分字匹配但是也匹配整个搜索字词的值?

And*_*bbs 12

我想我明白了.我绝对欢迎其他答案和其他更正.

解决方案似乎只是在使用EdgeNGramFilterFactorywhen索引时,而不是在查询时.当你想到它时,这是有道理的.索引时我想要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>
Run Code Online (Sandbox Code Playgroud)