原文:
http://www.cnblogs.com/wgp13x/p/3748764.html
前提: Solr提供了一整套的数据检索方案,一台四核CPU、16G内存的机器,千兆网络。 需求: 1、对Solr创建索引的效率有一定的要求。
2、中文分词速度要快,搜索速度也要快。
3、中文分词准确率有一定的要求。
说明: 以下是在Solr上分别配置不同的中文分词器,它们之间的比较。
名称
最近更新
速度(网上情报)
扩展性支持、其它
mmseg4j
2013
complex 60W字/s (1200 KB/s)
simple 100W字/s (1900 KB/s)
使用sougou词库,也可自定义
(complex\simple\MaxWord)
IKAnalyzer
2012
IK2012 160W字/s (3000KB/s)
支持用户词典扩展定义、支持自定义停止词
(智能\细粒度)
Ansj
2014
BaseAnalysis 300W字/s
hlAnalysis 40W字/s
支持用户自定义词典,可以分析出词性,有新词发现功能
paoding
2008
100W字/s
支持不限制个数的用户自定义词库
注意:
中文分词器可能与最新版本Lucene不兼容,配置好运行时出现TokenStream contractviolation错误,对于mmseg4j需要更改com.chenlb.mmseg4j.analysis.MMSegTokenizer源码,添加super.reset()在reset()内,重新编译后替换原jar。
创建索引效果:
FieldValue内容:
京華时报ぼおえ2009年1月23日报道,뭄내ㅠㅛㅜ치ㅗ受一股来自中西伯利亚的强冷空气影响,本市出现大风降温天气,白天最高气温只有零下7摄氏度celsius degree,同时伴有6到7级的偏北风。
在词库中补充:
京華、뭄내、ぼおえ、受一股来
类型
结果
textMaxWord
京華|时报|ぼ|お|え|2009|年|1|月|23|日|报道|뭄|내|ㅠ|ㅛ|ㅜ|치|ㅗ|受|一股|来|自|中|西|伯|利|亚|的|强|冷|空气|影响|本市|出现|大风|降温|天气|白天|最高|气温|只有|零下|7|摄氏|度|celsius|degree|同时|伴有|6|到|7|级|的|偏|北风
textComplex
京華|时报|ぼおえ|2009|年|1|月|23|日|报道|뭄내ㅠㅛ|ㅜ|치|ㅗ|受一股来|自|中|西伯利亚|的|强|冷空气|影响|本市|出现|大风|降温|天气|白天|最高气温|只有|零下|7|摄氏度|celsius|degree|同时|伴有|6|到|7|级|的|偏|北风
textSimple
京華|时报|ぼおえ|2009|年|1|月|23|日|报道|뭄내ㅠㅛ|ㅜ|치|ㅗ|受一股来|自|中西|伯|利|亚|的|强|冷空气|影响|本市|出现|大风|降温|天气|白天|最高气温|只有|零下|7|摄氏度|celsius|degree|同时|伴有|6|到|7|级|的|偏|北风
创建索引效率:
17个各种类型字段,在solr博文中字段基础上,选一空string类型字段改为新类型,并写入文本内容(原纯文本Size约为400B,SolrInputDocument对象Size约为1130B)。
文本内容以词库中任选20词拼成的句子,每词大约3字,一句大约60字。
总数据量为2000W条数据,与2.2节相同配置。
字段类型
创建时间(s)
索引大小(GB)
网络(MB/s)
速率(W条/s)
textMaxWord
3115
4.95
6.0
0.64 (38W字/s)
textComplex
4860
4.3
5.0
0.41 (25W字/s)
textSimple
3027
4.32
6.5
0.66 (40W字/s)
string
2350
9.08
8.0
0.85 (57W字/s)
速度:在与“solr博文http://www.cnblogs.com/wgp13x/p/3742653.html”中1.2节相同配置的情况下,分词索引创建速度要差于不使用分词的。
大小:分词索引大小要小于不使用分词的,经测试分词字段配置成autoGeneratePhraseQueries="false"对索引大小几乎没有影响。
数据搜索效率:
文本内容以词库中任选20词拼成的句子,每词大约3字,一句大约60字,总数据量为2000W条数据。
字段类型
关键词
搜索时间(ms)
结果(条)
textMaxWord
一不做二不休
180
2556
textComplex
一不做二不休
59
2648
textSimple
一不做二不休
62
2622
string
*一不做二不休*
20000
2689
textMaxWord
一个国家两种制度
22
2620
textComplex
一个国家两种制度
12
2687
textSimple
一个国家两种制度
10
2670
string
*一个国家两种制度*
15500
2657
textMaxWord
一些
24
15999
textComplex
一些
11
2687
textSimple
一些
9
2665
string
*一些*
14200
15758
textMaxWord
转辗反侧
15
2622
textComplex
转辗反侧
5
2632
textSimple
转辗反侧
9
2676
string
*转辗反侧*
15600
2665
补充:
对于非中文、数字、英文词汇,包括繁体字,在词典中加入新词汇即可。
mmseg4j对于“都是先从容易的做起”,不能把“容易”分出来,分词结果为“都是|先|从容|易|的|做起”。
网上推荐使用textMaxWord类型分词。
创建索引效果:
FieldValue内容、在词库中补充均同1.2。
分词字段配置autoGeneratePhraseQueries="false"
类型
结果
细粒度
京華|时报|ぼおえ|2009|年|1|月|23|日报|日|报道|뭄내ㅠㅛ|ㅜ|치|ㅗ|受一股来|一股|一|股|来自|中西|西伯利亚|西伯|伯利|亚|的|强冷空气|冷空气|空气|影响|本市|出现|大风|降温|天气|白天|最高|高气|气温|只有|有|零下|零|下|7|摄氏度|摄氏|度|celsius|degree|同时|伴有|有|6|到|7|级|的|偏北风|偏北|北风
创建索引效率:
字段类型
创建时间(s)
索引大小(GB)
网络(MB/s)
速率(W条/s)
细粒度
3584
5.06
6.0
0.56 (33W字/s)
速度:与1.2比较,分词索引创建速度要略差于使用mmseg4j分词的。
大小:分词索引大小要略大于使用mmseg4j分词的。
数据搜索效率:
字段类型
关键词
搜索时间(ms)
结果(条)
细粒度
一不做二不休
400
5949255
细粒度
一个国家两种制度
500
6558449
细粒度
一些
300
5312103
细粒度
转辗反侧
15
10588
补充:
mmseg4j中textMaxWord,“一不做二不休”被分为:一|不做|二不|不休;
IKAnalyzer中细粒度,“一不做二不休”被分为:一不做二不休|一|不做|二不休|二|不休;
因此同样使用autoGeneratePhraseQueries="false",“一不做二不休”搜索,IKAnalyzer搜索出来的结果要远多于mmseg4j。
创建索引效果:
FieldValue内容同1.2,没有补充词库。
<fieldType name="text_ansj"class="solr.TextField">
<analyzertype="index">
<tokenizerclass="org.ansj.solr.AnsjTokenizerFactory" conf="ansj.conf"rmPunc="true"/>
</analyzer>
<analyzertype="query">
<tokenizerclass="org.ansj.solr.AnsjTokenizerFactory" analysisType="1"rmPunc="true"/>
</analyzer>
</fieldType>
结果
京华|时报|ぼ|お|え|2009年|1月|23日|报道|,|뭄|내|ㅠ|ㅛ|ㅜ|치|ㅗ|受|一股|来自|中|西伯利亚|的|强|强冷空气|冷空气|影响|,|本市|出现|大风|降温|天气|,|白天|最高|气温|只|只有|有|零下|7摄氏度|摄氏|摄氏度|celsius||degree|,|同时|伴|伴有|有|6|到|7级|的|偏|偏北风|北风|。
“京華”二字被分词后变成了“京华”,据朋友介绍,它有将生僻字改字的Bug。
创建索引效率:
字段类型
创建时间(s)
索引大小(GB)
网络(MB/s)
速率(W条/s)
细粒度
3815
5.76
5.2
0.52 (31W字/s)
速度:与1.2、1.3比较,分词索引创建速度要略差于使用mmseg4j、IKAnalyzer分词的。
大小:分词索引大小要略大于使用mmseg4j、IKAnalyzer分词的。
数据搜索效率:
关键词
搜索时间(ms)
结果(条)
一不做二不休
200
2478
一个国家两种制度
15
0
一些
25
15665
转辗反侧
6
2655
按分词后的结果进行搜索,若在分词字段配置autoGeneratePhraseQueries="false",则是搜索条件先分词,再使用分词在结果中搜索,默认的是true。autoGeneratePhraseQueries="false"对创建索引速度没影响,对搜索结果有影响。也可以修改Solr的QueryPasser,对于输入的一个字符串,先进行相应分词,再使用分词结果在索引集中搜索。
精确或模糊*搜索,都是以词为单位搜索。精确搜索是指返回所有包含分词的结果。
分词器能对word、letter、digit等进行识别。
对于不使用分词的String类型进行搜索,只能通过模糊搜索*,搜到连字,以字为单位搜索。
在分词索引内搜索,速度较快;不分词,需要遍历所有文档,速度较慢。
如果需要分词的话,那分词速度是主要瓶颈。
综合考虑,mmseg4j是首选的中文分词器。
如有需要具体的测试代码,可以跟本人联系。