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

More Related Content

What's hot

Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
SANG WON PARK
 

What's hot (20)

從零開始做架構圖
從零開始做架構圖從零開始做架構圖
從零開始做架構圖
 
さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)
 
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
 
Open source APM Scouter로 모니터링 잘 하기
Open source APM Scouter로 모니터링 잘 하기Open source APM Scouter로 모니터링 잘 하기
Open source APM Scouter로 모니터링 잘 하기
 
JenkinsとjMeterで負荷テストの自動化
JenkinsとjMeterで負荷テストの自動化JenkinsとjMeterで負荷テストの自動化
JenkinsとjMeterで負荷テストの自動化
 
まずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニングまずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニング
 
NGINX Back to Basics: Ingress Controller (Japanese Webinar)
NGINX Back to Basics: Ingress Controller (Japanese Webinar)NGINX Back to Basics: Ingress Controller (Japanese Webinar)
NGINX Back to Basics: Ingress Controller (Japanese Webinar)
 
Apache spark 2.3 and beyond
Apache spark 2.3 and beyondApache spark 2.3 and beyond
Apache spark 2.3 and beyond
 
Real-time Data Ingestion from Kafka to ClickHouse with Deterministic Re-tries...
Real-time Data Ingestion from Kafka to ClickHouse with Deterministic Re-tries...Real-time Data Ingestion from Kafka to ClickHouse with Deterministic Re-tries...
Real-time Data Ingestion from Kafka to ClickHouse with Deterministic Re-tries...
 
sysloadや監視などの話(仮)
sysloadや監視などの話(仮)sysloadや監視などの話(仮)
sysloadや監視などの話(仮)
 
Alfresco勉強会#26 Alfresco SDK + Eclipseで開発してみよう
Alfresco勉強会#26 Alfresco SDK + Eclipseで開発してみようAlfresco勉強会#26 Alfresco SDK + Eclipseで開発してみよう
Alfresco勉強会#26 Alfresco SDK + Eclipseで開発してみよう
 
Productizing Structured Streaming Jobs
Productizing Structured Streaming JobsProductizing Structured Streaming Jobs
Productizing Structured Streaming Jobs
 
Apache Flink in the Cloud-Native Era
Apache Flink in the Cloud-Native EraApache Flink in the Cloud-Native Era
Apache Flink in the Cloud-Native Era
 
Query logging with proxysql
Query logging with proxysqlQuery logging with proxysql
Query logging with proxysql
 
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
 
Webinar: Deep Dive on Apache Flink State - Seth Wiesman
Webinar: Deep Dive on Apache Flink State - Seth WiesmanWebinar: Deep Dive on Apache Flink State - Seth Wiesman
Webinar: Deep Dive on Apache Flink State - Seth Wiesman
 
Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編
 
Apache Sparkにおけるメモリ - アプリケーションを落とさないメモリ設計手法 -
Apache Sparkにおけるメモリ - アプリケーションを落とさないメモリ設計手法 -Apache Sparkにおけるメモリ - アプリケーションを落とさないメモリ設計手法 -
Apache Sparkにおけるメモリ - アプリケーションを落とさないメモリ設計手法 -
 
Javaクラスファイルの読み方
Javaクラスファイルの読み方Javaクラスファイルの読み方
Javaクラスファイルの読み方
 
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
 

Similar to 深入淺出 autocomplete

网站前端代码静态检查工具综述
网站前端代码静态检查工具综述网站前端代码静态检查工具综述
网站前端代码静态检查工具综述
pop2008
 
D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践
Jackson Tian
 
02.python.开发最佳实践
02.python.开发最佳实践02.python.开发最佳实践
02.python.开发最佳实践
Na Lee
 
3.android 应用程序通用自动脱壳方法研究
3.android 应用程序通用自动脱壳方法研究3.android 应用程序通用自动脱壳方法研究
3.android 应用程序通用自动脱壳方法研究
Hsiao Tim
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
taobao.com
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
Jackson Tian
 
优酷 Web网站架构案例分析
优酷   Web网站架构案例分析优酷   Web网站架构案例分析
优酷 Web网站架构案例分析
George Ang
 
Youku arch qcon2009_beijing
Youku arch qcon2009_beijingYouku arch qcon2009_beijing
Youku arch qcon2009_beijing
drewz lin
 
Key value store
Key value storeKey value store
Key value store
xuanhan863
 

Similar to 深入淺出 autocomplete (20)

为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)
 
网站前端代码静态检查工具研究
网站前端代码静态检查工具研究网站前端代码静态检查工具研究
网站前端代码静态检查工具研究
 
网站前端代码静态检查工具综述
网站前端代码静态检查工具综述网站前端代码静态检查工具综述
网站前端代码静态检查工具综述
 
D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践
 
如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進
 
Win dbg入门
Win dbg入门Win dbg入门
Win dbg入门
 
Windbg入门
Windbg入门Windbg入门
Windbg入门
 
互联网创业服务器运维工具集
互联网创业服务器运维工具集互联网创业服务器运维工具集
互联网创业服务器运维工具集
 
02.python.开发最佳实践
02.python.开发最佳实践02.python.开发最佳实践
02.python.开发最佳实践
 
3.android 应用程序通用自动脱壳方法研究
3.android 应用程序通用自动脱壳方法研究3.android 应用程序通用自动脱壳方法研究
3.android 应用程序通用自动脱壳方法研究
 
Cephfs架构解读和测试分析
Cephfs架构解读和测试分析Cephfs架构解读和测试分析
Cephfs架构解读和测试分析
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledge
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
淺談 Groovy 與 Gradle
淺談 Groovy 與 Gradle淺談 Groovy 與 Gradle
淺談 Groovy 與 Gradle
 
Jasmine
JasmineJasmine
Jasmine
 
網路服務就是一連串搜尋的集合體
網路服務就是一連串搜尋的集合體網路服務就是一連串搜尋的集合體
網路服務就是一連串搜尋的集合體
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 
优酷 Web网站架构案例分析
优酷   Web网站架构案例分析优酷   Web网站架构案例分析
优酷 Web网站架构案例分析
 
Youku arch qcon2009_beijing
Youku arch qcon2009_beijingYouku arch qcon2009_beijing
Youku arch qcon2009_beijing
 
Key value store
Key value storeKey value store
Key value store
 

More from Mu Chun Wang

More from Mu Chun Wang (20)

你畢業後要任職的軟體業到底都在做些什麼事
你畢業後要任職的軟體業到底都在做些什麼事你畢業後要任職的軟體業到底都在做些什麼事
你畢業後要任職的軟體業到底都在做些什麼事
 
老司機帶你上手 PostgreSQL 關聯式資料庫系統
老司機帶你上手 PostgreSQL 關聯式資料庫系統老司機帶你上手 PostgreSQL 關聯式資料庫系統
老司機帶你上手 PostgreSQL 關聯式資料庫系統
 
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
 
Funliday 新創生活甘苦談
Funliday 新創生活甘苦談Funliday 新創生活甘苦談
Funliday 新創生活甘苦談
 
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
 
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
 
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
 
Google Maps 開始收費了該怎麼辦?
Google Maps 開始收費了該怎麼辦?Google Maps 開始收費了該怎麼辦?
Google Maps 開始收費了該怎麼辦?
 
Git 可以做到的事
Git 可以做到的事Git 可以做到的事
Git 可以做到的事
 
那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-Control那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-Control
 
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
 
如何與全世界分享你的 Library
如何與全世界分享你的 Library如何與全世界分享你的 Library
如何與全世界分享你的 Library
 
如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌
 
API Blueprint - API 文件規範的三大領頭之一
API Blueprint - API 文件規範的三大領頭之一API Blueprint - API 文件規範的三大領頭之一
API Blueprint - API 文件規範的三大領頭之一
 
團體共同協作與版本管理 - 01認識共同協作
團體共同協作與版本管理 - 01認識共同協作團體共同協作與版本管理 - 01認識共同協作
團體共同協作與版本管理 - 01認識共同協作
 
Git 經驗分享
Git 經驗分享Git 經驗分享
Git 經驗分享
 
手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務
 
你有想過畢業九年後的你會變什麼樣子嗎?
你有想過畢業九年後的你會變什麼樣子嗎?你有想過畢業九年後的你會變什麼樣子嗎?
你有想過畢業九年後的你會變什麼樣子嗎?
 
HR Search - 輕鬆管理面試者
HR Search - 輕鬆管理面試者HR Search - 輕鬆管理面試者
HR Search - 輕鬆管理面試者
 
Hedis - GET HBase via Redis
Hedis - GET HBase via RedisHedis - GET HBase via Redis
Hedis - GET HBase via Redis
 

深入淺出 autocomplete