關聯式資料庫不適合的用例
-
搜尋的本質在於它的順序。每個人都希望以最適合的結果顯示在頂部的方式顯示搜尋結果。關聯式資料庫沒有這種能力。另一方面,Elasticsearch 在預設情況下基於相關性顯示結果。
建立
與前面示例中使用的相同。
問題陳述
假設使用者想要搜尋
shirts
,但他對red
彩色襯衫感興趣。在這種情況下,包含red
和shirts
關鍵字的結果應該是最重要的。然後應該在他們之後顯示其他襯衫的結果。解決方案使用關聯式資料庫查詢
select * from product where name like '%Red%' or name like '%Shirt%'
;輸出
name | id -----------+---- Shirt | 1 Red Shirt | 2
Elasticsearch 解決方案
POST test/product/_search { "query": { "match": { "name": "Red Shirt" } } }
輸出
"hits": [ { "_index": "test", "_type": "product", "_id": "AVzglFomaus3G2tXc6sB", "_score": 1.2422675, ===> Notice this "_source": { "id": 2, "name": "Red Shirt" } }, { "_index": "test", "_type": "product", "_id": "AVzglD12aus3G2tXc6sA", "_score": 0.25427115, ===> Notice this "_source": { "id": 1, "name": "Shirt" } } ]
結論
正如我們在上面所看到的,Relational Database 以一些隨機順序返回結果,而 Elasticsearch 以
_score
的遞減順序返回結果,這是根據相關性計算的。 -
我們在輸入搜尋字串時往往會犯錯誤。有些使用者輸入了錯誤的搜尋引數。關聯式資料庫不會處理這種情況。Elasticsearch 來救援。
建立
與前面示例中使用的相同。
問題陳述
假設使用者想要搜尋
shirts
但是他錯誤地輸入了錯誤的單詞shrt
。使用者仍然希望看到襯衫的結果。解決方案使用關聯式資料庫查詢
select * from product where name like '%shrt%'
;輸出
No results found
Elasticsearch 解決方案
POST /test/product/_search { "query": { "match": { "name": { "query": "shrt", "fuzziness": 2, "prefix_length": 0 } } } }
輸出
"hits": [ { "_index": "test", "_type": "product", "_id": "AVzglD12aus3G2tXc6sA", "_score": 1, "_source": { "id": 1, "name": "Shirt" } }, { "_index": "test", "_type": "product", "_id": "AVzglFomaus3G2tXc6sB", "_score": 0.8784157, "_source": { "id": 2, "name": "Red Shirt" } } ]
結論
正如我們在上面所看到的,關聯式資料庫沒有返回搜尋到錯誤單詞的結果,而 Elasticsearch 使用其特殊的
fuzzy
查詢返回結果。