今天是小番外篇的結尾拉~
來談談一路上踩的雷 + 解析 Google 進階搜索進行吧
首先先談到 Elastic 的特性:
將原詞修改後存入資料庫,拆解儲存
不受影響 : 小寫字母、數字
受影響 : 中文字、大寫字母、符號
原詞 : "JavaScript Course one"
資料庫 : "javascript", "course", "one"
原詞 : "鐵人賽"
資料庫 : "鐵", "人", "賽"
若不進行設定 -> 容易搜索出無關緊要的資料
例如 Query : 鋼鐵人 -> "鋼", "鐵", "人" -> 得到 "鐵人賽"
實測案例 (寫入資料 "JavaScript Course"、"鐵人賽")
測試 1 中文 (query = 鐵人)
matchQuery : 有符合即可 (轉碼搜尋,可拆解) -> 查到
包含 鐵人
包含 鐵
包含 人
matchPhraseQuery : 順序須符合 (轉碼搜尋,不可拆解) -> 查到
包含 鐵人
termQuery 完整包含 (不轉碼搜尋,不可拆解,長度不可大於 1 ) -> 查不到
query 改為鐵 -> 查到
query 改為人 -> 查到
測試 2 英文 (query = "JavaScript Course")
matchQuery : 有符合即可 (轉碼搜尋,可拆解) -> 查到
須為 JavaScript or Course, 但大小寫不拘
matchPhraseQuery 順序須符合 (轉碼搜尋,不可拆解) -> 查到
須為 JavaScript Course, 但大小寫不拘
termQuery 完整包含 (不轉碼搜尋,不可拆解,長度不可大於 1 ) -> 查不到
query = JavaScript 查不到
query = Course 查不到
query = javascript 查的到
query = course 查的到
query = javascript course 查不到
以上實測完,其實很難做取捨,必須依照自己需求以及可接受的彈性進行設計
最無法理解的是 termQuery 用法!
一個小解法 設定欄位為 not_analyzed :
讓資料庫強制儲存一筆相同但未轉型資料,例如以下(DB 實際資料情況)
full_text : [javascript, course] -> 用來做模糊、一般搜索
extra_value : [JavaScript Course] -> 用來做強制搜索
好處 : 可以做強制搜索,當初就是為了強制搜索測了很久,踩了很多雷
壞處 : 可能造成資料多餘,必須將資料先進行架構性的規劃 (ex : 哪些欄位需要多儲存一個 not_analyzed 欄位)
最後談談 Google 搜尋引擎 做個收尾吧
Google 搜尋引擎真的做得很強,當然我只是做個簡單的小分析,如果真的要去深談它的內容,那就是另外一回事了。
首先 Google 搜尋引擎 基本上包含以下四大條件:
Google 一般搜尋 : matchQuery + fuzzy search
搜尋結果
搜尋 哈士七
Google 進階搜尋
termQuery + BoolQueryBuilder
番外篇-透過 ElasticSearch實作全文檢索 完結 !
明天要繼續 JavaScript 從無到有