Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

深入淺出 autocomplete

Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Chargement dans…3
×

Consultez-les par la suite

1 sur 158 Publicité

深入淺出 autocomplete

Télécharger pour lire hors ligne

autocomplete 是現代軟體服務最重要的特性之一,使用者在輸入框輸入了文字,軟體服務就會回傳最適當的選項給使用者,而使用者可以依照回傳的各個選項中選擇其中一個執行動作。

一般的技術文章,大都從前端的角度探討如何在輸入文字時,利用 debounce 和 throttle 這兩個技術,提升使用者的操作體驗及減少後端的負擔。極少探討後端如何實作 autocomplete 的資料結構,讓資料能夠快速回傳給前端。

這次的分享主要就是完全從後端的角度來探討如何利用 Redis 或 Elasticsearch 這類 NoSQL 實作 autocomplete,也會分享多個 autocomplete 常見的情境。

最後也會分享進入正式環境時的技術選型,應該用 Redis 還是用 Elasticsearch 比較好。

autocomplete 是現代軟體服務最重要的特性之一,使用者在輸入框輸入了文字,軟體服務就會回傳最適當的選項給使用者,而使用者可以依照回傳的各個選項中選擇其中一個執行動作。

一般的技術文章,大都從前端的角度探討如何在輸入文字時,利用 debounce 和 throttle 這兩個技術,提升使用者的操作體驗及減少後端的負擔。極少探討後端如何實作 autocomplete 的資料結構,讓資料能夠快速回傳給前端。

這次的分享主要就是完全從後端的角度來探討如何利用 Redis 或 Elasticsearch 這類 NoSQL 實作 autocomplete,也會分享多個 autocomplete 常見的情境。

最後也會分享進入正式環境時的技術選型,應該用 Redis 還是用 Elasticsearch 比較好。

Publicité
Publicité

Plus De Contenu Connexe

Diaporamas pour vous (20)

Similaire à 深入淺出 autocomplete (20)

Publicité

Plus par Mu Chun Wang (20)

Plus récents (20)

Publicité

深入淺出 autocomplete

  1. 1. 深入淺出 autocomplete Kewang, Funliday
  2. 2. Kewang ● 王慕羣 Kewang ● JavaScript / Java ● PostgreSQL / MongoDB / Elasticsearch / HBase ● Git / DevOps ● 熱愛開源 Linkedin Linkedin kewangtw kewangtw SlideShare SlideShare kewang kewang Gmail Gmail cpckewang cpckewang Facebook Facebook Kewang 的資訊進化論 Kewang 的資訊進化論 devopsday taipei devopsday taipei '17 '17 hadoopcon hadoopcon '14 '15 '14 '15 jcconf jcconf '16 '17 '18 '16 '17 '18 GitHub GitHub kewang kewang Funliday Funliday kewang kewang mopcon mopcon '14 '20 '14 '20 modernweb modernweb '18 '19 '20 '21 '18 '19 '20 '21 coscup coscup '20 '21 '20 '21
  3. 3. 4 分享的內容
  4. 4. 5 分享的內容
  5. 5. 6 分享的內容 1.一點點的前端 autocomplete Live DEMO
  6. 6. 7 分享的內容 1.一點點的前端 autocomplete Live DEMO 2.在後端使用 Redis 實作 autocomplete
  7. 7. 8 分享的內容 1.一點點的前端 autocomplete Live DEMO 2.在後端使用 Redis 實作 autocomplete 3.在後端使用 Elasticsearch 實作 autocomplete
  8. 8. 9 分享的內容 1.一點點的前端 autocomplete Live DEMO 2.在後端使用 Redis 實作 autocomplete 3.在後端使用 Elasticsearch 實作 autocomplete 4.各種使用情境
  9. 9. 10 開始
  10. 10. 11 什麼是 autocomplete ?
  11. 11. 12 什麼是 autocomplete ? ● 將使用者輸入的文字,使用前綴比對 (prefix match) 資料庫,成功回傳對應的待選詞 (candidates)
  12. 12. 13 什麼是 autocomplete ? ● 將使用者輸入的文字,使用前綴比對 (prefix match) 資料庫,成功回傳對應的待選詞 (candidates) ● 從使用者輸入文字到回傳待選詞的速度要夠快
  13. 13. 14 以往的 autocomplete 分享
  14. 14. 15 以往的 autocomplete 分享
  15. 15. 16 以往的 autocomplete 分享 ● debounce :同樣 function 連續觸發時只執行一次
  16. 16. 17 以往的 autocomplete 分享 ● debounce :同樣 function 連續觸發時只執行一次 ● throttle :同樣 function 連續觸發時降低執行頻率
  17. 17. 18 以往的 autocomplete 分享 ● debounce :同樣 function 連續觸發時只執行一次 ● throttle :同樣 function 連續觸發時降低執行頻率 ● Live DEMO
  18. 18. 19 以往的 autocomplete 分享 ● debounce :同樣 function 連續觸發時只執行一次 ● throttle :同樣 function 連續觸發時降低執行頻率 ● Live DEMO 後端內容好少 ...
  19. 19. 20 本次分享以後端為主
  20. 20. 21 先來看看 autocomplete 的基礎
  21. 21. 22 autocomplete 的基礎在於資料完整性
  22. 22. 23 autocomplete 的基礎在於資料完整性 ● 資料量小且定量
  23. 23. 24 autocomplete 的基礎在於資料完整性 ● 資料量小且定量 – 前端處理更快速
  24. 24. 25 autocomplete 的基礎在於資料完整性 ● 資料量小且定量 – 前端處理更快速 ● 資料量大且不定量
  25. 25. 26 autocomplete 的基礎在於資料完整性 ● 資料量小且定量 – 前端處理更快速 ● 資料量大且不定量 – 後端使用資料庫
  26. 26. 27 最直覺的開發方式
  27. 27. 28 直接使用 RDBMS
  28. 28. 29 直接使用 RDBMS
  29. 29. 30 直接使用 RDBMS 使用 LIKE 比對資料庫內容
  30. 30. 31 直接使用 RDBMS 使用 LIKE 比對資料庫內容 依照字典升序排序取出前 10 個
  31. 31. 32 問題點
  32. 32. 33 問題點 ● 資料量大時,需要對 name 建立 index
  33. 33. 34 問題點 ● 資料量大時,需要對 name 建立 index ● 並非一定會使用 index ,需視 query plan 而定
  34. 34. 35 改用 Redis 試試
  35. 35. 36 Redis
  36. 36. 37 Redis ● 所有資料都存放在記憶體
  37. 37. 38 Redis ● 所有資料都存放在記憶體 ● 低延遲和高輸送量
  38. 38. 39 Redis ● 所有資料都存放在記憶體 ● 低延遲和高輸送量 ● 讀寫操作時間低於 1ms
  39. 39. 40 Redis ● 所有資料都存放在記憶體 ● 低延遲和高輸送量 ● 讀寫操作時間低於 1ms ● 支援每秒百萬個操作
  40. 40. 41 先介紹 Sorted Set
  41. 41. 42 先介紹 Sorted Set ● Redis 的一種資料型態
  42. 42. 43 先介紹 Sorted Set ● Redis 的一種資料型態 ● 使用分數 (score) 做為排序的順序
  43. 43. 44 先介紹 Sorted Set ● Redis 的一種資料型態 ● 使用分數 (score) 做為排序的順序 ● 若分數相同,則使用字典排序做為順序
  44. 44. 45 索引階段 - 正規化文字 ( 以 Taïwan 為例 )
  45. 45. 46 索引階段 - 正規化文字 ( 以 Taïwan 為例 )
  46. 46. 47 索引階段 - 正規化文字 ( 以 Taïwan 為例 ) 1. 先標準化拆解
  47. 47. 48 索引階段 - 正規化文字 ( 以 Taïwan 為例 ) 1. 先標準化拆解 2. 再移除附加符號
  48. 48. 49 索引階段 - 正規化文字 ( 以 Taïwan 為例 ) 1. 先標準化拆解 2. 再移除附加符號 3. 最後全部轉為小寫
  49. 49. 50 索引階段 - 使用 ZADD 儲存
  50. 50. 51 索引階段 - 使用 ZADD 儲存 t ta tai taip taipe taipei taipei*
  51. 51. 52 索引階段 - 使用 ZADD 儲存 表示為完整的 candidate t ta tai taip taipe taipei taipei*
  52. 52. 53 索引階段 - 使用 ZADD 儲存 t ta tai taip taipe taipei taipei* 表示為完整的 candidate ZADD 儲存到 Redis t ta tai taip taipe taipei taipei*
  53. 53. 54 索引階段 - 使用 ZADD 儲存 t ta tai taip taipe taipei taipei* 表示為完整的 candidate ZADD 儲存到 Redis t ta tai taip taipe taipei taipei* t ta tai taiw taiwa taiwan taiwan*
  54. 54. 55 索引階段 - 使用 ZADD 儲存 t ta tai taip taipe taipei taipei* taiw taiwa taiwan taiwan* 表示為完整的 candidate ZADD 儲存到 Redis t ta tai taip taipe taipei taipei* t ta tai taiw taiwa taiwan taiwan* ZADD 儲存到 Redis
  55. 55. 56 索引階段 - 使用 ZADD 儲存
  56. 56. 57 索引階段 - 使用 ZADD 儲存
  57. 57. 58 索引階段 - 使用 ZADD 儲存 score
  58. 58. 59 索引階段 - 使用 ZADD 儲存 score candidate
  59. 59. 60 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋
  60. 60. 61 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋 ta
  61. 61. 62 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋 使用者輸入 ta
  62. 62. 63 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋 ta 使用者輸入 ta
  63. 63. 64 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋 ZRANK 定位 ta 使用者輸入 ta
  64. 64. 65 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋 t ta tai taip taipe taipei taipei* taiw taiwa taiwan taiwan* ZRANK 定位 ta 使用者輸入 ta
  65. 65. 66 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋 t ta tai taip taipe taipei taipei* taiw taiwa taiwan taiwan* ZRANK 定位 ta 回傳 使用者輸入 ta
  66. 66. 67 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋 t ta tai taip taipe taipei taipei* taiw taiwa taiwan taiwan* ZRANK 定位 ta 回傳 2 使用者輸入 ta
  67. 67. 68 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋 t ta tai taip taipe taipei taipei* taiw taiwa taiwan taiwan* ZRANK 定位 ta ZRANGE 取得 2 後面 n 個 回傳 2 使用者輸入 ta
  68. 68. 69 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋 t ta tai taip taipe taipei taipei* taiw taiwa taiwan taiwan* ZRANK 定位 ta ZRANGE 取得 2 後面 n 個 回傳 2 回傳 使用者輸入 ta
  69. 69. 70 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋 t ta tai taip taipe taipei taipei* taiw taiwa taiwan taiwan* ZRANK 定位 ta ZRANGE 取得 2 後面 n 個 回傳 2 回傳 ta tai taip taipe taipei taipei* taiw taiwa taiwan taiwan* 使用者輸入 ta
  70. 70. 71 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋 t ta tai taip taipe taipei taipei* taiw taiwa taiwan taiwan* ZRANK 定位 ta ZRANGE 取得 2 後面 n 個 回傳 2 回傳 ta tai taip taipe taipei taipei* taiw taiwa taiwan taiwan* 整理後回傳使用者 使用者輸入 ta
  71. 71. 72 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋 t ta tai taip taipe taipei taipei* taiw taiwa taiwan taiwan* ZRANK 定位 ta ZRANGE 取得 2 後面 n 個 回傳 2 回傳 ta tai taip taipe taipei taipei* taiw taiwa taiwan taiwan* 整理後回傳使用者 taipei taiwan 使用者輸入 ta
  72. 72. 73 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋
  73. 73. 74 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋
  74. 74. 75 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋 先定位
  75. 75. 76 搜尋階段 - 使用 ZRANK 及 ZRANGE 搜尋 先定位 再取出部分資料
  76. 76. 77 優缺點
  77. 77. 78 優缺點  維運方便
  78. 78. 79 優缺點  維運方便  資料全部儲存於記憶體,速度快
  79. 79. 80 優缺點  維運方便  資料全部儲存於記憶體,速度快  需人工介入的部分較多
  80. 80. 81 優缺點  維運方便  資料全部儲存於記憶體,速度快  需人工介入的部分較多  資料全部儲存於記憶體,成本高
  81. 81. 82 來個複雜一點的 Elasticsearch
  82. 82. 83 Elasticsearch
  83. 83. 84 Elasticsearch ● 分散式的免費開源搜尋和分析引擎
  84. 84. 85 Elasticsearch ● 分散式的免費開源搜尋和分析引擎 ● 適用於包括文字、數字、地理資訊、結構化和非 結構化資料
  85. 85. 86 先介紹 Edge n-gram tokenizer
  86. 86. 87 先介紹 Edge n-gram tokenizer ● Elasticsearch 的其中一種分詞器
  87. 87. 88 先介紹 Edge n-gram tokenizer ● Elasticsearch 的其中一種分詞器 ● 可將輸入的單詞固定從頭分割 n 個字元
  88. 88. 89 先介紹 Edge n-gram tokenizer ● Elasticsearch 的其中一種分詞器 ● 可將輸入的單詞固定從頭分割 n 個字元 ● 以 taipei 舉例
  89. 89. 90 先介紹 Edge n-gram tokenizer ● Elasticsearch 的其中一種分詞器 ● 可將輸入的單詞固定從頭分割 n 個字元 ● 以 taipei 舉例 – t
  90. 90. 91 先介紹 Edge n-gram tokenizer ● Elasticsearch 的其中一種分詞器 ● 可將輸入的單詞固定從頭分割 n 個字元 ● 以 taipei 舉例 – t – ta
  91. 91. 92 先介紹 Edge n-gram tokenizer ● Elasticsearch 的其中一種分詞器 ● 可將輸入的單詞固定從頭分割 n 個字元 ● 以 taipei 舉例 – t – ta – tai
  92. 92. 93 先介紹 Edge n-gram tokenizer ● Elasticsearch 的其中一種分詞器 ● 可將輸入的單詞固定從頭分割 n 個字元 ● 以 taipei 舉例 – t – ta – tai – taip
  93. 93. 94 先介紹 Edge n-gram tokenizer ● Elasticsearch 的其中一種分詞器 ● 可將輸入的單詞固定從頭分割 n 個字元 ● 以 taipei 舉例 – t – ta – tai – taip – taipe
  94. 94. 95 先介紹 Edge n-gram tokenizer ● Elasticsearch 的其中一種分詞器 ● 可將輸入的單詞固定從頭分割 n 個字元 ● 以 taipei 舉例 – t – ta – tai – taip – taipe – taipei
  95. 95. 96 前置設定 - Settings
  96. 96. 97 前置設定 - Settings
  97. 97. 98 前置設定 - Settings 設定最大值,避免切出過多不必要的詞
  98. 98. 99 前置設定 - Mappings
  99. 99. 100 前置設定 - Mappings
  100. 100. 101 前置設定 - Mappings 搜尋時使用 keyword analyzer ,避免切詞
  101. 101. 102 索引階段
  102. 102. 103 索引階段
  103. 103. 104 索引階段 會利用 edge n-gram 切詞後寫入索引
  104. 104. 105 搜尋階段
  105. 105. 106 搜尋階段
  106. 106. 107 搜尋階段 搜尋時利用 keyword analyzer 不切詞搜尋
  107. 107. 108 Elasticsearch 的 filter​context
  108. 108. 109 Elasticsearch 的 filter​context ● Elasticsearch 搜尋時會依照計算出來的分數排序
  109. 109. 110 Elasticsearch 的 filter​context ● Elasticsearch 搜尋時會依照計算出來的分數排序 ● filter 不計算分數
  110. 110. 111 Elasticsearch 的 filter​context ● Elasticsearch 搜尋時會依照計算出來的分數排序 ● filter 不計算分數 ● 經常使用相同的 filter 會被 cache ,加快搜尋速度
  111. 111. 112 優缺點
  112. 112. 113 優缺點  內建機制即可達成
  113. 113. 114 優缺點  內建機制即可達成  資料全部儲存於硬碟,成本低
  114. 114. 115 優缺點  內建機制即可達成  資料全部儲存於硬碟,成本低  維運成本高
  115. 115. 116 各種使用情境
  116. 116. 117 文字包括 metadata
  117. 117. 118 文字包括 metadata - Redis
  118. 118. 119 文字包括 metadata - Redis t ta tai taip taipe taipei taipei*123456 taiw taiwa taiwan taiwan*556677
  119. 119. 120 文字包括 metadata - Redis t ta tai taip taipe taipei taipei*123456 taiw taiwa taiwan taiwan*556677
  120. 120. 121 文字包括 metadata - Elasticsearch
  121. 121. 122 文字包括 metadata - Elasticsearch
  122. 122. 123 依照使用頻率排序
  123. 123. 124 依照使用頻率排序 - Redis
  124. 124. 125 依照使用頻率排序 - Redis
  125. 125. 126 依照使用頻率排序 - Redis index name
  126. 126. 127 依照使用頻率排序 - Redis index name score
  127. 127. 128 依照使用頻率排序 - Redis index name score candidate
  128. 128. 129 依照使用頻率排序 - Redis
  129. 129. 130 依照使用頻率排序 - Redis
  130. 130. 131 依照使用頻率排序 - Redis 依照分數
  131. 131. 132 依照使用頻率排序 - Redis 依照分數 降冪排序
  132. 132. 133 依照使用頻率排序 - Redis 依照分數 降冪排序 總共取前 50 筆
  133. 133. 134 依照使用頻率排序 - Elasticsearch
  134. 134. 135 依照使用頻率排序 - Elasticsearch
  135. 135. 136 依照使用頻率排序 - Elasticsearch
  136. 136. 137 依照使用頻率排序 - Elasticsearch
  137. 137. 138 依照使用頻率排序 - Elasticsearch 加上 sort 即可
  138. 138. 139 Live DEMO
  139. 139. 140 Conclusion
  140. 140. 141 Conclusion 項目 client RDBMS Redis Elasticsearch 儲存空間 ( 少→多 ) 維運成本 ( 便宜→貴 ) 讀取速度 ( 快→慢 ) 擴充性 ( 易→難 )
  141. 141. 142 Conclusion 項目 client RDBMS Redis Elasticsearch 儲存空間 ( 少→多 ) 1 維運成本 ( 便宜→貴 ) 讀取速度 ( 快→慢 ) 擴充性 ( 易→難 )
  142. 142. 143 Conclusion 項目 client RDBMS Redis Elasticsearch 儲存空間 ( 少→多 ) 1 2 4 3 維運成本 ( 便宜→貴 ) 讀取速度 ( 快→慢 ) 擴充性 ( 易→難 )
  143. 143. 144 Conclusion 項目 client RDBMS Redis Elasticsearch 儲存空間 ( 少→多 ) 1 2 4 3 維運成本 ( 便宜→貴 ) 1 讀取速度 ( 快→慢 ) 擴充性 ( 易→難 )
  144. 144. 145 Conclusion 項目 client RDBMS Redis Elasticsearch 儲存空間 ( 少→多 ) 1 2 4 3 維運成本 ( 便宜→貴 ) 2 1 3 4 讀取速度 ( 快→慢 ) 擴充性 ( 易→難 )
  145. 145. 146 Conclusion 項目 client RDBMS Redis Elasticsearch 儲存空間 ( 少→多 ) 1 2 4 3 維運成本 ( 便宜→貴 ) 2 1 3 4 讀取速度 ( 快→慢 ) 1 擴充性 ( 易→難 )
  146. 146. 147 Conclusion 項目 client RDBMS Redis Elasticsearch 儲存空間 ( 少→多 ) 1 2 4 3 維運成本 ( 便宜→貴 ) 2 1 3 4 讀取速度 ( 快→慢 ) 1 4 2 3 擴充性 ( 易→難 )
  147. 147. 148 Conclusion 項目 client RDBMS Redis Elasticsearch 儲存空間 ( 少→多 ) 1 2 4 3 維運成本 ( 便宜→貴 ) 2 1 3 4 讀取速度 ( 快→慢 ) 1 4 2 3 擴充性 ( 易→難 ) 1
  148. 148. 149 Conclusion 項目 client RDBMS Redis Elasticsearch 儲存空間 ( 少→多 ) 1 2 4 3 維運成本 ( 便宜→貴 ) 2 1 3 4 讀取速度 ( 快→慢 ) 1 4 2 3 擴充性 ( 易→難 ) 4 1 3 2
  149. 149. 150 Conclusion
  150. 150. 151 Conclusion ● 沒錢的時候用 Redis
  151. 151. 152 Conclusion ● 沒錢的時候用 Redis ● 有維運技術用 Elasticsearch
  152. 152. 153 Conclusion ● 沒錢的時候用 Redis ● 有維運技術用 Elasticsearch ● 複雜排序用 Elasticsearch
  153. 153. 154 One more thing
  154. 154. 155 Practical Autocomplete
  155. 155. 156
  156. 156. 157 References ● Practical Autocomplete ● Auto Complete with Redis ● Edge n-gram tokenizer ● Debounce ThrottleTest
  157. 157. 158

×