ES中的分析器和IK分詞器外掛
一些概念
Token(詞元)
全文搜尋引擎會用某種演算法對要建索引的文件進行分析, 從文件中提取出若干Tokenizer(分詞器)
Tokenizer(分詞器)
這些演算法叫做Tokenizer(分詞器)
Token Filter(詞元處理器)
這些Token會被進一步處理, 比如轉成小寫等, 這些處理演算法被稱為TokenFilter(詞元處理器)
Term(詞)
被處理後的結果被稱為Term(詞)
Character Filter(字元過濾器)
文字被Tokenizer處理前可能要做一些預處理, 比如去掉裡面的HTML標記, 這些處理的演算法被稱為Character Filter(字元過濾器)
Analyzer(分析器)
這整個的分析演算法被稱為Analyzer(分析器)
Analyzer(分析器)由Tokenizer(分詞器)和Filter(過濾器)組成
圖片
ES中的分詞器
ES內建分析器
- standard analyzer
- simple analyzer
- stop analyzer
- keyword analyzer
- pattern analyzer
- language analyzers
- snowball analyzer
- custom analyzer
ES內建分析器
- standard tokenizer
- edge ngram tokenizer
- keyword tokenizer
- letter analyzer
- lowercase analyzer
- ngram analyzers
- whitespace analyzer
- pattern analyzer
- uax email url analyzer
- path hierarchy analyzer
ES內建過濾器
- standard filter
- ascii folding filter
- length filter
- lowercase filter
- ngram filter
- edge ngram filter
- porter stem filter
- shingle filter
- stop filter stop
- word delimiter filter
- stemmer token filter
- stemmer override filter
- keyword marker filter
- keyword repeat filter
- kstem filter
- snowball filter
- phonetic filter
- synonym filter
- compound word filter
- reverse filter
- elision filter
- truncate filter
- unique filter
- pattern capture filter
- pattern replace filter
- trim filter
- limit token count filter
- hunspell filter
- common grams filter
- normalization filter
ES內建的character filter
- mapping char filter 根據配置的對映關係替換字元
- html strip char filter 去掉HTML元素
- pattern replace char filter 用正則表示式處理字串
自定義分析器
ES允許使用者通過配置檔案elasticsearch.yml自定義分析器Analyzer
index:
analysis:
analyzer:
myAnalyzer:
tokenizer: standard
filter: [standard, lowercase, stop]
也可以使用第三方分析器,比如IKAnalyzer
IKAnalyzer
IK簡介
IK Analyzer是一個開源的,基於java語言開發的輕量級的中文分詞工具包。從2006年12月推出1.0版開始, IKAnalyzer已經推出了4個大版本。最初,它是以開源專案Luence為應用主體的,結合詞典分詞和文法分析演算法的中文分片語件。從3.0版本開 始,IK發展為面向Java的公用分片語件,獨立於Lucene專案,同時提供了對Lucene的預設優化實現。在2012版本中,IK實現了簡單的分詞 歧義排除演算法,標誌著IK分詞器從單純的詞典分詞向模擬語義分詞衍化。
IK Analyzer 2012特性
1.採用了特有的“正向迭代最細粒度切分演算法“,支援細粒度和智慧分詞兩種切分模式;
2.在系統環境:Core2 i7 3.4G雙核,4G記憶體,window 7 64位, Sun JDK 1.6_29 64位 普通pc環境測試,IK2012具有160萬字/秒(3000KB/S)的高速處理能力。
3.2012版本的智慧分詞模式支援簡單的分詞排歧義處理和數量詞合併輸出。
4.採用了多子處理器分析模式,支援:英文字母、數字、中文詞彙等分詞處理,相容韓文、日文字元
5.優化的詞典儲存,更小的記憶體佔用。支援使用者詞典擴充套件定義。特別的,在2012版本,詞典支援中文,英文,數字混合詞語。
安裝
- 執行命令:mvn clean package,打包生成elasticsearch-analysis-ik-1.2.5.jar
- 將這個jar拷貝到ES_HOME/plugins/analysis-ik目錄下面,如果沒有該目錄,則先建立該目錄
- ES_HOME/config/elasticsearch.yml檔案在檔案最後加入如下內容:
index:
analysis:
analyzer:
ik:
alias: [ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider
ik_max_word:
type: ik
use_smart: false
ik_smart:
type: ik
use_smart: true
index.analysis.analyzer.default.type: ik
測試
- 建立一個索引,名為index。
curl -XPUT http://localhost:9200/index
- 為索引index建立mapping
curl -XPOST http://localhost:9200/index/fulltext/_mapping -d'
{
"fulltext": {
"_all": {
"analyzer": "ik"
},
"properties": {
"content": {
"type" : "string",
"boost" : 8.0,
"term_vector" : "with_positions_offsets",
"analyzer" : "ik",
"include_in_all" : true
}
}
}
}'
- 測試
curl 'http://localhost:9200/index/_analyze?analyzer=ik&pretty=true' -d '
{
"text":"世界如此之大"
}'
4.顯示結果
{
"tokens" : [ {
"token" : "text",
"start_offset" : 4,
"end_offset" : 8,
"type" : "ENGLISH",
"position" : 1
}, {
"token" : "世界",
"start_offset" : 11,
"end_offset" : 13,
"type" : "CN_WORD",
"position" : 2
}, {
"token" : "如此",
"start_offset" : 13,
"end_offset" : 15,
"type" : "CN_WORD",
"position" : 3
}, {
"token" : "之大",
"start_offset" : 15,
"end_offset" : 17,
"type" : "CN_WORD",
"position" : 4
} ]
}