SOLR 3.5子串与EdgeNGramFilter匹配

时间:2013-07-08 08:05:20

标签: solr

以下是我用于自动完成目的的新字段类型:

<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”“ring”

因此查询“lord of”匹配,但查询“the rings”不匹配。

我知道,对于索引(性能和磁盘空间),保持所有可能的边缘ngrams组合是昂贵的,但是对于应用程序我们必须这样做。

欢迎任何可能的解决方案。

提前致谢并致以最诚挚的问候。

1 个答案:

答案 0 :(得分:0)

查询the rings应该匹配。

EdgeNGramFilterFactory将生成边缘图,但生成的边克数具有相同的位置。

因此,如果您检查由边缘克生成的标记将具有相同的位置。

, - &gt; 1
lo,lor,lord - &gt; 2
th, - &gt; 3
ri,rin,ring,rings - &gt; 4

因此,查询lord of以及the rings应与搜索的字段匹配,因为它们彼此相邻。

如果查询在同一字段上搜索,请使用debug进行检查。