繁体   English   中英

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

[英]How to configure SOLR so users can make prefix search by default?

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

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

我对一个项目有同样的要求。 我不得不实施建议。 我做的是定义这个建议字段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”的字段,我在其中保存了数据

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

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

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

影响 :-

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

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

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

我通过采用最后一个术语来处理这个问题,然后在最后一个术语和一个通配符上放置一个OR,例如“我最喜欢的书”变成“我最喜欢的+(书或书*)”,然后返回“我最喜欢的书架”。 您可能想要对输入进行一些处理(转义等)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM