【问题标题】:How to configure Solr to do partial word matching如何配置 Solr 进行部分单词匹配
【发布时间】:2015-02-26 22:06:14
【问题描述】:

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

价值观:

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

【问题讨论】:

    标签: solr lucene sunspot


    【解决方案1】:

    我想我明白了。 不过,我绝对欢迎其他答案和其他更正。

    解决方案似乎是仅在索引时使用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>
    

    【讨论】:

      【解决方案2】:

      我有类似的需求并尝试了这个...创建了不同的字段类型...

      <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

      【讨论】:

        【解决方案3】:

        你可以使用

        N-Gram 过滤器

        生成给定范围内大小的 n-gram 标记。请注意,标记是按位置排序的,然后是按克数排序的。

        工厂类:solr.NGramFilterFactory

        参数:

        minGramSize:(整数,默认 1)最小 gram 大小。 maxGramSize:(整数,默认 2)最大 gram 大小。

        例子:

        <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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-02-02
          • 1970-01-01
          • 1970-01-01
          • 2013-08-08
          • 1970-01-01
          • 2013-10-28
          • 1970-01-01
          相关资源
          最近更新 更多