出自 图灵学院 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"
}
}
}
}