[英]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
您可能需要通过在搜索项末尾附加通配符来在客户端进行处理。
影响 :-
另一种选择是使用您需要的处理来实现自定义查询解析器。
我相信你现在已经想到了这一点,但这里有一个答案:
我通过采用最后一个术语来处理这个问题,然后在最后一个术语和一个通配符上放置一个OR,例如“我最喜欢的书”变成“我最喜欢的+(书或书*)”,然后返回“我最喜欢的书架”。 您可能想要对输入进行一些处理(转义等)。
如果你是专门寻找与结果的开头相匹配的文字,那么边缘n-gram是要走的路,但是从阅读你的问题来看,你似乎并没有真正要求它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.