我正在使用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
您要么必须在客户端通过在搜索词的末尾附加通配符来进行处理。
影响:-
- 通配符查询对性能有影响
- 通配符查询不进行分析。因此,查询时间分析不会应用于您的搜索词
我相信你现在已经明白了,但是这里有一个答案:
我通过取最后一项并将最后一项加上通配符的OR来处理此问题,例如:"my favorite book"变成"my+favorite+(book OR book*)",然后返回"my favorite bookshelf"。无论如何,您可能希望对输入进行一些处理(转义等)。
如果你特别寻找与结果开头匹配的文本,那么边n-grams是可行的,但从你的问题来看,似乎你并没有真正要求。