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

时间:2015-02-26 22:06:14

标签: solr lucene sunspot

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

值:

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字段的正确配置是返回部分字匹配但又与整个搜索字词匹配的值吗?

3 个答案:

答案 0 :(得分:9)

我想我明白了。 我非常欢迎其他答案和其他更正。

解决方案似乎只是在编制索引时使用EdgeNGramFilterFactory,而不是在查询时使用<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> 。当你想到它时,这是有道理的。索引时我想要n-gram,但只想在查询时匹配实际的搜索词。

{{1}}

答案 1 :(得分:0)

我有类似的要求,试过这个...创建了不同的字段类型......

<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

答案 2 :(得分:0)

您可以使用

N语法过滤器

生成大小在给定范围内的n-gram令牌。请注意,令牌是按位置排序,然后按大小排序。

Factory类: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”,“ or”,“ re”

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