写点什么

001 ES suggest-IK 中文

用户头像
小林-1025
关注
发布于: 2021 年 04 月 29 日

此次操作的结果是,在使用 ik_smart 作为 analyzer 和 search_analyzer 的情况下

(1)prefix completion 效果较为理想

(2)term / phrase suggest 均没有得到想要的效果


为什么用 ik_smart? 不是 ik_max_word?

ik_max_word 是最大颗粒度的进行分词,对我们检索的关键字会进行最大颗粒度的分词,鉴于 es 进行 suggest 的机制,在进行最大颗粒度分词后,suggest 效果应该不会理想

实际上,在设置 ik_max_word 分词后确实也没有得到想要的效果


  1. 首先我们查看下 ik_smart 的分词结果,既然我们想拿到 suggest 的结果,

POST /ocr2/_analyze{  "analyzer": "ik_smart",  "text": ["好记性使用手册不如烂笔头感叹号博客园"]}
# result{ "tokens" : [ { "token" : "好记性", "start_offset" : 0, "end_offset" : 3, "type" : "CN_WORD", "position" : 0 }, { "token" : "使用手册", "start_offset" : 3, "end_offset" : 7, "type" : "CN_WORD", "position" : 1 }, { "token" : "不如", "start_offset" : 7, "end_offset" : 9, "type" : "CN_WORD", "position" : 2 }, { "token" : "烂", "start_offset" : 9, "end_offset" : 10, "type" : "CN_CHAR", "position" : 3 }, { "token" : "笔头", "start_offset" : 10, "end_offset" : 12, "type" : "CN_WORD", "position" : 4 }, { "token" : "博客园", "start_offset" : 15, "end_offset" : 18, "type" : "CN_WORD", "position" : 5 } ]}
复制代码


  1. 建立索引,注意 type 和分词器的选择

PUT /ocr2{  "mappings" : {    "properties" : {    "text": {             "type": "text",            "analyzer":"ik_smart",            "search_analyzer":"ik_smart"        },        "pageid": {             "type": "completion",            "search_analyzer": "ik_max_word",            "analyzer": "ik_max_word"        }    }  }}
复制代码


  1. 写入数据

POST /ocr2/_create/1{"pageid":"好记性使用手册不如烂笔头感叹号博客园", "text":"好记性使用手册不如烂笔头感叹号博客园"}
POST /ocr2/_create/2{"pageid":"好记性使用手川不如烂笔头感叹号博客园", "text":"好记性使用手册不如烂笔头感叹号博客园"}
POST /ocr2/_create/3{"pageid":"好记性使用手川不如烂笔头感叹号博客园", "text":"好记性使用手川不如烂笔头感叹号博客园"}
复制代码


  1. 前缀补全,结果较为理想

POST /ocr2/_search{  "suggest": {    "my-suggestion": {      "prefix": "好记性",      "completion": {        "field": "pageid"      }    }  }}
# result,从结果可见,前缀匹配结果较为理想,index中的数据都得到了匹配{ "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 0, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "suggest" : { "my-suggestion" : [ { "text" : "好记性", "offset" : 0, "length" : 3, "options" : [ { "text" : "好记性使用手册不如烂笔头感叹号博客园", "_index" : "ocr2", "_type" : "_doc", "_id" : "1", "_score" : 1.0, "_source" : { "pageid" : "好记性使用手册不如烂笔头感叹号博客园", "text" : "好记性使用手册不如烂笔头感叹号博客园" } }, { "text" : "好记性使用手川不如烂笔头感叹号博客园", "_index" : "ocr2", "_type" : "_doc", "_id" : "2", "_score" : 1.0, "_source" : { "pageid" : "好记性使用手川不如烂笔头感叹号博客园", "text" : "好记性使用手册不如烂笔头感叹号博客园" } }, { "text" : "好记性使用手川不如烂笔头感叹号博客园", "_index" : "ocr2", "_type" : "_doc", "_id" : "3", "_score" : 1.0, "_source" : { "pageid" : "好记性使用手川不如烂笔头感叹号博客园", "text" : "好记性使用手川不如烂笔头感叹号博客园" } } ] } ] }}
复制代码


  1. 接下来我们看下 term suggest,给出的 options 是“使用”和“手”,并不是很理想,这和 ik 分词有很大的关系,由前问可知“使用手册”是一个词,而“使用手川”不是,而我们想要的结果是“使用手川”可以给出“使用手册”的建议

POST /ocr2/_search{   "suggest": {    "my-suggestion": {      "text": "使用手川",      "term": {        "field": "text",        "suggest_mode": "always"      }    }  }}
# result{ "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 0, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "suggest" : { "my-suggestion" : [ { "text" : "用手", "offset" : 1, "length" : 2, "options" : [ ] }, { "text" : "川", "offset" : 3, "length" : 1, "options" : [ ] } ] }}
复制代码


  1. 继续看下 Phrase suggest 得到的结果,依然没有得到我们想要的结果

POST /ocr2/_search{   "suggest": {    "my-suggestion": {      "text": "使用手川",      "phrase": {        "field": "text"      }    }  }}
# result{ "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 0, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "suggest" : { "my-suggestion" : [ { "text" : "使用手川", "offset" : 0, "length" : 4, "options" : [ ] } ] }}
复制代码


发布于: 2021 年 04 月 29 日阅读数: 13
用户头像

小林-1025

关注

还未添加个人签名 2018.03.01 加入

还未添加个人简介

评论

发布
暂无评论
001 ES suggest-IK 中文