Solr Using n-grams for suggestions

N-grams

         N-gram分析会根据配置中指定的子中最小最大长度,将一个词的最小到最大的子串全部得到,比如Tonight这个单词,如果NGramFilterFactory配置中指定了minGramSize2maxGramSize5,那么会产生下面的索引词:(2-grams)To, on , ni, ig, gh, ht(3-grams)ton, oni, nig, ight, ght, (4-grams)toni, onig, nigh, ight, (5-grams)tonigonigh, night。注意Tonight完整的词不会产生,因为词的长度不能超过maxGramSizeN-Gram可以用作一个词元过滤器,也可以用作为分词器NGramTokenizerFactory,它会产生跨单词的n-Gram

         下是是使用n-grams匹配子串的推荐配置:

<fieldType name="nGram" class="solr.TextField"

positionIncrementGap="100" stored="false" multiValued="true">

<analyzer type="index">

<tokenizer class="solr.StandardTokenizerFactory"/>

<!-- potentially word delimiter, synonym filter, stop words,

NOT stemming -->

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.NGramFilterFactory" minGramSize="2"

maxGramSize="15"/>

</analyzer>

<analyzer type="query">

<tokenizer class="solr.StandardTokenizerFactory"/>

<!-- potentially word delimiter, synonym filter, stop words,

NOT stemming -->

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

        注意n-Gram只在索引时进行,gram的大小配置是根据你想进行匹配子串的长度而决定 的(示例中是最小是2,最长是15)。

         N_gram分析的结果可以放到另一个用于匹配子串的域中。用dismaxquery解析器支持搜索多个域,在搜索匹配这个子串的域可以设置较小的boost

         另一个变形的是EdgeNGramTokenizerFactoryEdgeNGramFilterFactory,它会忽略输入文本开头或结尾的n-Gram。对过滤器来说,输入是一个词,对分词器来说,它是整个字符流。除了minGramSizemaxGramSize之后,它还有一个side参数,可选值为frontback。如果只需要前缀匹配或是后缀匹配,那边EdgeNGram分析是你所需要的了。

N-gram costs

         n-Gram的代价很高。前面的例子中Tonight15个子串词,而普通的文本分析的结果一般只有一个词。这种转换会产生很多词,也就需要更长的时间去索引。以MusicBrainz Schema为例,a_name域以普通方式索引并storeda_ngram域对a_name中的值进行n-Gram分析,子串的长度为2-15。它不是一个stored域,因为Artist的名字已经保存在a_name中了。

a_name a_name + a_ngram

Increase

Indexing Time 46 seconds 479 seconds > 10x

Disk Size 11.7 MB 59.7 MB > 5x

Distinct Terms 203,431 1,288,720 > 6x

         上表给出了只索引a_name和索引a_namea_ngram的统计信息。注意索引时间增加了10倍,而索引大小增加了5倍。注意,这才只是一个域。

         注意如果变大minGramSize的大小,nGram的代价会小很多。Edge nGraming也代价也会小,因为它只关心开头或结尾的nGram。基于nGram的分词器无疑会比基于nGram的过滤器代码要高,因为分词器将产生带空格的词,然而,这种方式可以支持跨词的通配符。


你可能感兴趣的:(Solr Using n-grams for suggestions)