【问题标题】:How to configure SOLR so users can make prefix search by default?如何配置 SOLR 以便用户可以默认进行前缀搜索?
【发布时间】:2011-11-21 17:21:13
【问题描述】:

我正在使用 SOLR 3.2。我的应用程序针对文本字段类型在 SOLR 实例上发出搜索查询。当用户发出诸如“book”之类的查询时,我如何使 SOLR 返回诸如“book”、“bookshelf”、“bookasd”之类的结果。我应该手动将“*”字符附加到查询字符串,还是在 SOLR 中有设置,所以默认情况下它会在字段上进行前缀搜索?

这是文本字段类型的 schema.xml 部分:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <charFilter class="solr.HTMLStripCharFilterFactory"/>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="stopwords.txt"
                enablePositionIncrements="true"
                />
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
      </analyzer>
      <analyzer type="query">
        <charFilter class="solr.HTMLStripCharFilterFactory"/>
        <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" catenat0All="1" splitOnCaseChange="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
      </analyzer>
    </fieldType>

【问题讨论】:

  • 你找到答案了吗?

标签: search solr wildcard prefix


【解决方案1】:

有几种方法可以做到这一点,但在性能方面您可能希望使用EdgeNgramFilterFacortory

【讨论】:

    【解决方案2】:

    我对一个项目有同样的要求。我必须实施建议。我所做的是定义这个建议字段类型

    <fieldType class="solr.TextField" name="suggester">
        <analyzer  type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            
            <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="3" outputUnigrams="true" outputUnigramsIfNoShingles="false" />
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" enablePositionIncrements="true" />
        </analyzer>
        <analyzer  type="query">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>
    

    我使用 ShingleFilterFactory 是因为我需要获得由一个或多个单词组成的建议。

    然后我使用分面查询来获得建议。

    Facet.Limit=10

    Facet.Prefix="book"

    Facet.Field="Suggester" //这是我保存数据的带有 fieldType="suggester" 的字段

    我知道它使用构面结果,但也许它可以解决您的问题。

    如果我的或Jayendra Patil's answer 没有为您提供解决方案,您也可以查看EdgeNGramFilterFactory

    【讨论】:

      【解决方案3】:

      您必须在客户端进行处理,方法是在搜索词的末尾附加通配符。

      影响:-

      1. 通配符查询会影响性能
      2. 通配符查询不进行分析。因此查询时间分析不会应用于您的搜索字词

      另一种选择是使用您需要的处理实现自定义查询解析器。

      【讨论】:

        【解决方案4】:

        我相信你现在已经想通了,但是这里有一个答案:

        我通过取最后一个词并在最后一个词加上通配符加上一个 OR 来处理这个问题,例如“我最喜欢的书”变成“我的+最喜欢的+(书或书*)”,并会返回“我最喜欢的书架”。无论如何,您可能都想对输入进行一些处理(转义等)。

        如果您专门寻找与结果开头匹配的文本,那么边缘 n-gram 是可行的方法,但从阅读您的问题来看,您似乎并没有真正要求这样做。

        【讨论】:

          猜你喜欢
          • 2017-08-22
          • 1970-01-01
          • 2013-06-13
          • 1970-01-01
          • 2019-05-06
          • 2013-09-30
          • 1970-01-01
          • 2011-07-13
          • 1970-01-01
          相关资源
          最近更新 更多