如何配置SOLR,使用户默认可以进行前缀搜索



我正在使用SOLR 3.2。我的应用程序在SOLR实例上针对文本字段类型发出搜索查询。如何让SOLR在用户输入"book"等查询时返回"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>

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

我在一个项目中也有同样的需求。我必须执行《建议》。我所做的就是定义这个建议器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,因为我需要得到由一个或多个单词组成的建议。

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

方面。限制= 10

Facet.Prefix ="book"

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

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

如果我或Jayendra Patil的答案没有提供给你一个解决方案,你也可以看看EdgeNGramFilterFactory

您要么必须在客户端通过在搜索词的末尾附加通配符来进行处理。

影响:-

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

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

我通过取最后一项并将最后一项加上通配符的OR来处理此问题,例如:"my favorite book"变成"my+favorite+(book OR book*)",然后返回"my favorite bookshelf"。无论如何,您可能希望对输入进行一些处理(转义等)。

如果你特别寻找与结果开头匹配的文本,那么边n-grams是可行的,但从你的问题来看,似乎你并没有真正要求。

最新更新