我正在尝试使用一系列过滤器来实现合理的名称建议功能.目前我有
<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>
Run Code Online (Sandbox Code Playgroud)
这肯定需要更多的调整,但我追求这个问题的一个特定方面.对于输入字符串mark daniel sievers
,上面的内容将匹配查询mark
,sievers
但我真正想要的是减少其详细程度,EdgeNGramFilter
因为它会导致匹配,并使用可以以某种可配置方式组合单词的过滤器/标记器,例如输入mark daniel rex sievers
创建标记mark sievers
,mark daniel sievers
,mark rex sievers
等等.我没有应用任何特定算法,但我想知道这样的野兽是否存在(几乎可以肯定)或最好将自己编写为过滤插件?
Solr 3.3.0
我使用的是ShingleFilter:http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.ShingleFilterFactory
例如 :
<filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true"/>
Run Code Online (Sandbox Code Playgroud)
输入:mark daniel sievers
.
代币产生:mark, mark daniel, mark daniel sievers, daniel, daniel sievers, sievers
.