我正在使用EdgeNGramFilterFactory实现solr通配符搜索。我正在尝试实现前/后搜索。例如,搜索“格式系统”和“系统格式”以返回相同的结果。我已经为正面和背面配置了EdgeNGramFilterFactory,但只有前面的“”格式系统“搜索工作没有回”系统格式“。你可以建议我错过了什么或者我错过了什么吗?
这是我的配置
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.StopFilterFactory" words="stopwords_en.txt" ignoreCase="true" />
<!-- <filter class="solr.SnowballPorterFilterFactory" language="English" /> -->
<filter class="EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
<filter class="EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="back" />
</analyzer>
</fieldType>
答案 0 :(得分:2)
您提到的示例并不适合,因为它包含术语,当您搜索术语时,您不需要任何通配符。如果你想搜索一个术语部分,比如sys,那么让NGrams看起来是个好主意。我建议你看看你的solr分析页面,看看你的分析仪链的结果。
配置了EdgeNGramFilterFactory
的 side="front"
,系统输入将生成以下字词:
sy sys syst syste system
这样您就可以搜索sys或syste并获得结果,即使您最初编入索引的术语是系统。
配置了EdgeNGramFilterFactory
的 side="back"
,系统输入将生成以下字词:
em tem stem ystem system
通过这种方式,您可以搜索tem或ystem并获得结果。
如果将它们放在同一个链中,则第二个分析器会处理第一个分析器生成的每个术语。你基本上是从每个前NGram中取回NGrams,这不是你想要的。
最好先澄清您的要求。如果您仍想要前后生成NGrams,您应该在两个不同的字段中进行,然后您可以使用edismax
解析器进行搜索。