之前用一元分词,但是在query不使用双引号来精确搜索的情况下,得到的结果在排序上不令人满意。而二元分词在用户打错字的情况下,又会有一些词搜不到,比如 奥云会,就不能命中 奥运会。
这种情况下,我使用了NGram分词,并设置minGramSize = 1, maxGramSize = 2。这样结合了一元和二元的结果。虽然索引时间稍长,但在文本长度不长,又使用过一次加双引号的精确搜索后,用NGram来模糊搜寻,得到的结果比较满意。
不过测试中发现高亮出现了问题。 比如有文本 ngram = "为里约奥运会中国女排加油!",而我搜 q = 中国男排, 搜到结果是有 "为里约奥运会中国女排加油!"的,但是高亮项目上,得到的却是 "为里约奥运<em>中国女排</em>加油",高亮的是 "中国女排"。 而我想的到的是分别高亮"中国"和"排"就好。
我一开始以为是因为我的min和max设的数不一样造成的,但是都改为3后,搜“奥运会男排加油”,高亮的是“奥运会中国女排加油”。
其他原因我暂时没有思路,希望能有高手帮忙看一下。
我用的是Solr 5.3版本,附部分schema如下:
<field name="ngram" type="text_ngram" indexed="true" stored="true" multiValued="false"/> <fieldType name="text_ngram" class="solr.TextField" positionIncrementGap="100"> <analyzer> <tokenizer class="solr.NGramTokenizerFactory" minGramSize="1" maxGramSize="2"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>