出自 图灵学院 ElasticSearch课程, 我自己学完了,整理了一下,然后给老师说的话,记录了一下,发了个博客

概述

suggest search(completion suggest):就是建议搜索或称为搜索建议,也可以叫做自动完成-auto completion。类似百度中的搜索联想提示功能。

ES实现suggest的时候,性能非常高,其构建的不是倒排索引,也不是正排索引,就是纯的用于进行前缀搜索的一种特殊的数据结构,而且会全部放在内存中,所以suggest search进行的前缀搜索提示,性能是非常高。

需要使用suggest的时候,必须在定义index时,为其mapping指定开启suggest。具体如下:

入门使用suggest search

创建

  1. PUT /movie
  2. {
  3. "mappings": {
  4. "properties": {
  5. "title": {
  6. "type": "text",
  7. "analyzer": "ik_max_word",
  8. "fields": {
  9. "suggest": { //这个名字可以随便起,这里取名为suggest
  10. "type": "completion", //类型是completion,就是自动补全
  11. "analyzer": "ik_max_word" //采用的分词器
  12. }
  13. }
  14. },
  15. "content": {
  16. "type": "text",
  17. "analyzer": "ik_max_word"
  18. }
  19. }
  20. }
  21. }

插入三条测试数据

  1. PUT /movie/_doc/1
  2. {
  3. "title": "西游记电影系列",
  4. "content": "西游记之月光宝盒将与2021年进行......"
  5. }
  6. PUT /movie/_doc/2
  7. {
  8. "title": "西游记文学系列",
  9. "content": "某知名网络小说作家已经完成了大话西游同名小说的出版"
  10. }
  11. PUT /movie/_doc/3
  12. {
  13. "title": "西游记之大话西游手游",
  14. "content": "网易游戏近日出品了大话西游经典IP的手游,正在火爆内测中"
  15. }

suggest 搜索:

  1. GET /movie/_search
  2. {
  3. "suggest": {//这个字段是关键字,不能随便起名
  4. "my-suggest": { // 这个是自己起的名字
  5. "prefix": "西游记", // 这个是前缀
  6. "completion": {
  7. "field": "title.suggest" //这个是你自己定义的索引
  8. }
  9. }
  10. }
  11. }


“field”: “title.suggest”:是你自己定义的索引
image.png

结果:

  1. {
  2. "took" : 312,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 0,
  13. "relation" : "eq"
  14. },
  15. "max_score" : null,
  16. "hits" : [ ]
  17. },
  18. "suggest" : {
  19. "my-suggest" : [
  20. {
  21. "text" : "西游记",
  22. "offset" : 0,
  23. "length" : 3,
  24. "options" : [
  25. {
  26. "text" : "西游记之大话西游手游",
  27. "_index" : "movie",
  28. "_type" : "_doc",
  29. "_id" : "3",
  30. "_score" : 1.0,
  31. "_source" : {
  32. "title" : "西游记之大话西游手游",
  33. "content" : "网易游戏近日出品了大话西游经典IP的手游,正在火爆内测中"
  34. }
  35. },
  36. {
  37. "text" : "西游记文学系列",
  38. "_index" : "movie",
  39. "_type" : "_doc",
  40. "_id" : "2",
  41. "_score" : 1.0,
  42. "_source" : {
  43. "title" : "西游记文学系列",
  44. "content" : "某知名网络小说作家已经完成了大话西游同名小说的出版"
  45. }
  46. },
  47. {
  48. "text" : "西游记电影系列",
  49. "_index" : "movie",
  50. "_type" : "_doc",
  51. "_id" : "1",
  52. "_score" : 1.0,
  53. "_source" : {
  54. "title" : "西游记电影系列",
  55. "content" : "西游记之月光宝盒将与2021年进行......"
  56. }
  57. }
  58. ]
  59. }
  60. ]
  61. }
  62. }

有没有发现,结果都是以 “西游记” 开头的, 当你输入”西游记”的时候, ElasticSearch就直接给”西游记”开头的数据都找出来给用户展示.

如果你输入”西游记手游” ,肯定是找不到的索引库里面为 “title” : “西游记之大话西游手游”, 的数据
,因为 suggest search 和模糊搜索是不一样的.因为suggest search 就是搜索以关键字开头的文本,并没有关键字在中间的.

比如说百度你搜索 “你好”, 出来的数据全都是你好开头的数据.没有开头不带”你好”的数据,中间带”你好”的数据

image.png

  1. GET /movie/_search
  2. {
  3. "suggest": {
  4. "my-suggest": {
  5. "prefix": "西游记手游",
  6. "completion": {
  7. "field": "title.suggest"
  8. }
  9. }
  10. }
  11. }