出自 图灵学院 ElasticSearch课程, 我自己学完了,整理了一下,然后给老师说的话,记录了一下,发了个博客
概述
suggest search(completion suggest):就是建议搜索或称为搜索建议,也可以叫做自动完成-auto completion。类似百度中的搜索联想提示功能。
ES实现suggest的时候,性能非常高,其构建的不是倒排索引,也不是正排索引,就是纯的用于进行前缀搜索的一种特殊的数据结构,而且会全部放在内存中,所以suggest search进行的前缀搜索提示,性能是非常高。
需要使用suggest的时候,必须在定义index时,为其mapping指定开启suggest。具体如下:
入门使用suggest search
创建
PUT /movie{"mappings": {"properties": {"title": {"type": "text","analyzer": "ik_max_word","fields": {"suggest": { //这个名字可以随便起,这里取名为suggest"type": "completion", //类型是completion,就是自动补全"analyzer": "ik_max_word" //采用的分词器}}},"content": {"type": "text","analyzer": "ik_max_word"}}}}
插入三条测试数据
PUT /movie/_doc/1{"title": "西游记电影系列","content": "西游记之月光宝盒将与2021年进行......"}PUT /movie/_doc/2{"title": "西游记文学系列","content": "某知名网络小说作家已经完成了大话西游同名小说的出版"}PUT /movie/_doc/3{"title": "西游记之大话西游手游","content": "网易游戏近日出品了大话西游经典IP的手游,正在火爆内测中"}
suggest 搜索:
GET /movie/_search{"suggest": {//这个字段是关键字,不能随便起名"my-suggest": { // 这个是自己起的名字"prefix": "西游记", // 这个是前缀"completion": {"field": "title.suggest" //这个是你自己定义的索引}}}}
“field”: “title.suggest”:是你自己定义的索引
结果:
{"took" : 312,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 0,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"suggest" : {"my-suggest" : [{"text" : "西游记","offset" : 0,"length" : 3,"options" : [{"text" : "西游记之大话西游手游","_index" : "movie","_type" : "_doc","_id" : "3","_score" : 1.0,"_source" : {"title" : "西游记之大话西游手游","content" : "网易游戏近日出品了大话西游经典IP的手游,正在火爆内测中"}},{"text" : "西游记文学系列","_index" : "movie","_type" : "_doc","_id" : "2","_score" : 1.0,"_source" : {"title" : "西游记文学系列","content" : "某知名网络小说作家已经完成了大话西游同名小说的出版"}},{"text" : "西游记电影系列","_index" : "movie","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"title" : "西游记电影系列","content" : "西游记之月光宝盒将与2021年进行......"}}]}]}}
有没有发现,结果都是以 “西游记” 开头的, 当你输入”西游记”的时候, ElasticSearch就直接给”西游记”开头的数据都找出来给用户展示.
如果你输入”西游记手游” ,肯定是找不到的索引库里面为 “title” : “西游记之大话西游手游”, 的数据
,因为 suggest search 和模糊搜索是不一样的.因为suggest search 就是搜索以关键字开头的文本,并没有关键字在中间的.
比如说百度你搜索 “你好”, 出来的数据全都是你好开头的数据.没有开头不带”你好”的数据,中间带”你好”的数据

GET /movie/_search{"suggest": {"my-suggest": {"prefix": "西游记手游","completion": {"field": "title.suggest"}}}}
