摘要:比如對中華人民共和國進(jìn)行分詞,會認(rèn)為這就是一個詞,結(jié)果就是一個中華人民共和國。和配合使用一般情況下,為了提高搜索的效果,需要這兩種分詞器配合使用。我們首先在內(nèi)創(chuàng)建一個叫的索引,其中名字的分詞器用的是。
1.Elasticsearch默認(rèn)分詞器? ? ? ? 我在之前的文章中介紹過 Elasticsearch的安裝和使用,這里我們使用Kibina作為工具來操作es,可以使用es的_analyze來分析分詞器的分詞結(jié)果。
? ? ? ? ES默認(rèn)的分詞器為英文分詞器,對英文句子能做到比較好的分詞,我們看一個例子。當(dāng)輸入以下請求時,對"What"s your name"句子進(jìn)行分詞,能看到將幾個詞都分了出來。
POST _analyze
{
"tokenizer": "standard",
"text": "What"s your name"
}? ? ? ??
{
"tokens" : [
{
"token" : "What"s",
"start_offset" : 0,
"end_offset" : 6,
"type" : "" ,
"position" : 0
},
{
"token" : "your",
"start_offset" : 7,
"end_offset" : 11,
"type" : "" ,
"position" : 1
},
{
"token" : "name",
"start_offset" : 12,
"end_offset" : 16,
"type" : "" ,
"position" : 2
}
]
}
? ? ? ? 當(dāng)輸入中文"你叫什么名字"時,可以看到標(biāo)準(zhǔn)分詞器將句子分成了一個一個的字,這顯然在我們實際使用的過程中是沒辦法接受的。
POST _analyze
{
"tokenizer": "standard",
"text": "你叫什么名字"
}
{
"tokens" : [
{
"token" : "你",
"start_offset" : 0,
"end_offset" : 1,
"type" : "" ,
"position" : 0
},
{
"token" : "叫",
"start_offset" : 1,
"end_offset" : 2,
"type" : "" ,
"position" : 1
},
{
"token" : "什",
"start_offset" : 2,
"end_offset" : 3,
"type" : "" ,
"position" : 2
},
{
"token" : "么",
"start_offset" : 3,
"end_offset" : 4,
"type" : "" ,
"position" : 3
},
{
"token" : "名",
"start_offset" : 4,
"end_offset" : 5,
"type" : "" ,
"position" : 4
},
{
"token" : "字",
"start_offset" : 5,
"end_offset" : 6,
"type" : "" ,
"position" : 5
}
]
}
2. IK分詞器
? ? ? ? 由于英文句子都是使用空{(diào) "tokens" : [ { "token" : "你", "start_offset" : 0, "end_offset" : 1, "type" : "CN_CHAR", "position" : 0 }, { "token" : "叫什么", "start_offset" : 1, "end_offset" : 4, "type" : "CN_WORD", "position" : 1 }, { "token" : "名字", "start_offset" : 4, "end_offset" : 6, "type" : "CN_WORD", "position" : 2 } ] } 格進(jìn)行分隔,因此在分詞比較明確,但是中文由于語言特性,分詞比較難分,也容易產(chǎn)生分詞歧義,如果自己開發(fā)分詞器,成本會比較大,所以一般在使用過程中都會用一些分詞器,比較著名的有Jieba分詞器,hanlp等,我們這里介紹一個es的插件分詞器,ik分詞器。可以從github下載分詞器的壓縮包,下載地址:?github.com/medcl/elast…?,在es的plugins目錄下創(chuàng)建一個ik的目錄,把解壓后的文件放到ik目錄下,然后重啟Elasticsearch。
? ? ? ? 這時,我們把之前的分詞器換成ik_smart,再來看效果??梢钥吹接胕k_smart已經(jīng)能夠?qū)⒅形倪M(jìn)行分詞。
POST _analyze
{
"tokenizer": "ik_smart",
"text": "你叫什么名字"
}
{
"tokens" : [
{
"token" : "你",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "叫什么",
"start_offset" : 1,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "名字",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 2
}
]
}
? ? ? ? 除了ik_smart之外,還有一個ik_max_wrod分詞器。
ik_smart會將文本做比較粗粒度的切分。比如對中華人民共和國進(jìn)行分詞,會認(rèn)為這就是一個詞,結(jié)果就是一個中華人民共和國。
而ik_max_word則對文本做比較細(xì)粒度的切分,會出現(xiàn)各種長度的詞。如果同樣對中華人民共和國進(jìn)行分詞,會分出很多的詞。
{
"tokens" : [
{
"token" : "中華人民共和國",
"start_offset" : 0,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "中華人民",
"start_offset" : 0,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "中華",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "華人",
"start_offset" : 1,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "人民共和國",
"start_offset" : 2,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 4
},
{
"token" : "人民",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 5
},
{
"token" : "共和國",
"start_offset" : 4,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 6
},
{
"token" : "共和",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 7
},
{
"token" : "國",
"start_offset" : 6,
"end_offset" : 7,
"type" : "CN_CHAR",
"position" : 8
}
]
}
? ? ? ? 這兩種分詞器在應(yīng)對具體的場景時,需要選擇合適的分詞器進(jìn)行使用。
3. ik_smart和ik_max_word配合使用? ? ? ?一般情況下,為了提高搜索的效果,需要這兩種分詞器配合使用。既索引時用ik_max_word盡可能多的分詞,而搜索時用ik_smart盡可能提高匹配準(zhǔn)度,讓用戶的搜索盡可能的準(zhǔn)確。比如一個常見的場景,就是搜索"進(jìn)口紅酒"的時候,盡可能的不要出現(xiàn)口紅相關(guān)商品或者讓口紅不要排在前面。
? ? ? ? 我們首先在Elasticsearch內(nèi)創(chuàng)建一個叫g(shù)oods的索引,其中名字的分詞器用的是ik_max_word。
PUT /goods
{
"mappings":{
"goods": {
"properties": {
"id": {
"type": "keyword"
},
"name": {
"analyzer": "ik_max_word",
"type": "text"
}
}
}
},
"settings":{
"index": {
"refresh_interval": "1s",
"number_of_shards": 5,
"max_result_window": "10000000",
"mapper": {
"dynamic": "false"
},
"number_of_replicas": 0
}
}
}
? ? ? ? ?然后我們通過POST請求,往里面添加一些數(shù)據(jù)。
POST /goods/goods
{
"id":"1",
"name":"美麗粉色口紅明星"
}
POST /goods/goods
{
"id":"2",
"name":"好喝的進(jìn)口紅酒"
}
POST /goods/goods
{
"id":"3",
"name":"進(jìn)口紅酒真好喝"
}
? ? ? ? 最后,在查詢的時候,我們指定查詢分詞器為ik_smart。
GET /goods/goods/_search
{
"query":{
"match": {
"name": {
"query": "進(jìn)口紅酒",
"analyzer": "ik_smart"
}
}
}
}
? ? ? ? 可以看到兩條進(jìn)口紅酒相關(guān)的記錄被搜了出來,但是口紅沒有被搜出來
{
"took" : 28,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 0.36464313,
"hits" : [
{
"_index" : "goods",
"_type" : "goods",
"_id" : "cdLk1WoBvRMfJWIKVfOP",
"_score" : 0.36464313,
"_source" : {
"id" : "3",
"name" : "進(jìn)口紅酒真好喝"
}
},
{
"_index" : "goods",
"_type" : "goods",
"_id" : "ctLk1WoBvRMfJWIKX_O6",
"_score" : 0.36464313,
"_source" : {
"id" : "2",
"name" : "好喝的進(jìn)口紅酒"
}
}
]
}
}
4. 總結(jié)
? ? ? ? 分詞器是Elasticsearch中很重要的一部分,網(wǎng)上也有很多開源的分詞器,對于一般的應(yīng)用這些開源分詞器也許足夠用了,但是在某些特定的場景下,可能需要對分詞器做一些優(yōu)化,甚至需要自研一些分詞器。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/7320.html
閱讀 3225·2021-11-24 09:39
閱讀 3157·2021-10-21 09:38
閱讀 2396·2019-08-29 15:28
閱讀 3737·2019-08-26 12:23
閱讀 2615·2019-08-26 12:19
閱讀 1358·2019-08-23 12:44
閱讀 2125·2019-08-23 12:02
閱讀 993·2019-08-22 17:05