前提: Solr提供了一整套的數據檢索方案,一台四核CPU、16G內存的機器,千兆網絡。
需求: 1、對Solr創建索引的效率有一定的要求。
2、中文分詞速度要快,搜索速度也要快。
3、中文分詞准確率有一定的要求。
說明: 以下是在Solr上分別配置不同的中文分詞器,它們之間的比較。
1. 中文分詞
1.1 中文分詞器概述
| 名稱 |
最近更新 |
速度(網上情報) |
擴展性支持、其它 |
| 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。
1.2 mmseg4j
創建索引效果:
| 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類型分詞。
1.3 IKAnalyzer
創建索引效果:
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。
1.4 Ansj
創建索引效果:
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 |
1.5 總結
按分詞后的結果進行搜索,若在分詞字段配置autoGeneratePhraseQueries="false",則是搜索條件先分詞,再使用分詞在結果中搜索,默認的是true。autoGeneratePhraseQueries="false"對創建索引速度沒影響,對搜索結果有影響。也可以修改Solr的QueryPasser,對於輸入的一個字符串,先進行相應分詞,再使用分詞結果在索引集中搜索。
精確或模糊*搜索,都是以詞為單位搜索。精確搜索是指返回所有包含分詞的結果。
分詞器能對word、letter、digit等進行識別。
對於不使用分詞的String類型進行搜索,只能通過模糊搜索*,搜到連字,以字為單位搜索。
在分詞索引內搜索,速度較快;不分詞,需要遍歷所有文檔,速度較慢。
如果需要分詞的話,那分詞速度是主要瓶頸。
綜合考慮,mmseg4j是首選的中文分詞器。
如有需要具體的測試代碼,可以跟本人聯系。
