以下是我用于自动完成目的的新字段类型:
<fieldType name="autocomplete_edge" class="solr.TextField">
<analyzer type="index">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" maxGramSize="30" minGramSize="2"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
字段定义如下:
<field name="title" type="autocomplete_edge" indexed="true" stored="true" required="true"/>
我的问题是,假设索引字段文本是:
“指环王”
我的目标是 SOLR 可以通过以下所有查询返回此文档:
query-1:title:“th” query-2:title:“the lor” query-3:title:“lord of” query-4:title:“the rin”
等等
在通过 EdgeNGram 进行标记和过滤后分析生成的索引时,我看到索引项如下:
“th” “the” “lo” “lor” “lord” “of” “th” “the” “ri” “rin” “ring” “rings”
因此查询“lord of”匹配但查询“the ring”不匹配。
我知道,对于索引(性能和磁盘空间),保留边缘 ngram 的所有可能组合是昂贵的,但是对于应用程序,我们必须这样做。
欢迎任何可能的解决方案。
提前致谢并致以最诚挚的问候。