我正在尝试使用一系列过滤器来实现合理的名称建议功能。目前我有
<fieldType name="suggester" class="solr.TextField" positionIncrementGap="1" autoGeneratePhraseQueries="true">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ShingleFilterFactory" outputUnigramsIfNoShingles="true" maxShingleSize="2"
outputUnigrams="true"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ShingleFilterFactory" outputUnigramsIfNoShingles="true" maxShingleSize="2"
outputUnigrams="true"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15"/>
</analyzer>
</fieldType>
这当然需要更多的调整,但我在这个问题的一个特定方面。对于输入字符串mark daniel sievers
,上述内容将匹配mark
和sievers
上的查询,但我真正想要的是减少EdgeNGramFilter
的详细程度,因为它会导致匹配过度使用可以某种可配置方式组合单词的过滤器/标记器,例如输入mark daniel rex sievers
创建标记mark sievers
,mark daniel sievers
,mark rex sievers
等。我没有应用任何特定的算法,但我想知道这样的野兽是否存在(几乎可以肯定)或最好将我自己编写为过滤插件?
Solr 3.3.0
答案 0 :(得分:5)
我使用的是ShingleFilter:http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.ShingleFilterFactory
例如:
<filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true"/>
输入:mark daniel sievers
。
代币生成:mark, mark daniel, mark daniel sievers, daniel, daniel sievers, sievers
。