如何配置SOLR以便用户默认进行前缀搜索?

时间:2011-09-21 07:59:24

标签: search solr wildcard prefix

我正在使用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>

4 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点,但在性能方面你可能想要使用EdgeNgramFilterFacortory

答案 1 :(得分:1)

我对项目有同样的要求。我不得不实施建议。我所做的是定义这个建议字段fieldType

<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 = “书”

     

Facet.Field =“Suggester”//这是 fieldType =“suggester”的字段,其中保存了数据

我知道它使用了分面结果,但也许它解决了你的问题。

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

答案 2 :(得分:0)

您可能需要在搜索字词末尾附加通配符来在客户端进行处理。

影响: -

  1. 通配符查询会对性能产生影响
  2. 通配符查询不会进行分析。因此,查询时间分析不会应用于您的搜索字词
  3. 另一个选择是使用您需要的处理来实现自定义查询解析器。

答案 3 :(得分:0)

我相信你现在已经知道了这一点,但这里有一个答案:

我通过采用最后一个术语并将最后一个术语加上一个通配符来处理这个问题,例如: “我最喜欢的书”成为“我最喜欢的+(书或书*)”,并将返回“我最喜欢的书架”。您可能希望对输入进行一些处理(转义等)。

如果你是专门寻找与结果开头相匹配的文字,那么边缘n-gram是要走的路,但是从阅读你的问题来看,你似乎并没有真正要求它。