搜索:ElasticSearch vs 關系型數據庫


前言

我們開發應用時,本質上都是對數據的增刪查改,現在我們來說一下查,一般web應用中的查都是預先定義的,會在搜索部分預先定義好搜索字段,因為基於傳統關系型數據庫,我們都是預先進行各方面的考慮然后來預先定義好SQL語句的,這種查詢與其說是查詢數據不如說是在過濾數據。

1. 先來看看傳統數據庫對搜索的支持。

就拿當下最流行的MySQL為例,MySQL是當下Web應用開發中最流行的關系型數據庫。對此數據庫了解的人很多,做項目時技術儲備上不會有什么問題。包括調優等技巧,懂的人也不少。

拿電商業務來說,假設用MySQL來做搜索會遇到什么問題呢,假如一個用戶要搜索某個商品,那傳統搜索會做成預先設定一些搜索字段,首先對用戶來說非常繁瑣不方便,用戶需要的是鍵入關鍵字搜索到自己需要的商品,這一點關系型數據庫做不到,其次,比如用戶在商品描述里鍵入“省電的取暖器”,如果用MySQL實現會寫如下語句:SELECT * FROM goods where description like %關鍵詞%,這樣做理論上確實能匹配到一些數據,但假設商品描述里並不是這么寫的,而是寫成“取暖器省電”,那就匹配不到了。另外從技術上說like是全表掃描的,如果表數據量少還好說要是數據量千萬級別甚至更多,那耗時是不可想象的,用戶體驗會非常糟糕。另外對於搜索中的分詞問題更是傳統關系型數據庫所做不到的。

2. 再來看ElasticSearch

ElasticSearch是一個基於Lucene的分布式搜索引擎,業內簡稱ES。它提供了基於RESTful 風格的全文搜索API。Elasticsearch是用Java開發的,並作為Apache許可條款下的開放源碼發布,是當前最流行的企業級搜索引擎。另外,它的分布式設計讓它天生就適合用於雲計算中,並能夠達到准實時搜索,而且安裝使用方便,還擁有穩定,可靠,快速等特性,是當下搜索技術中不二的選擇。

但是ElasticSearch不支持事務,不適合做基礎數據存儲,加入選擇ES做數據存儲,則免不了出現臟數據。所以推薦使用MySQL作為數據存儲,利用事務特性,可以做穩定存儲。再利用ES的搜索功能來實現應用的搜索功能。

3. 如何讓數據庫和ES結合使用

創建的每個Elasticsearch索引都應該由符合ACID的數據存儲支持。 數據庫應該是基礎數據來源並導入ES索引。 如果異常情況發生(節點丟失,中斷或誤操作 )導致丟失了索引,您將能夠完全恢復它。 一般的用法是另外的數據庫比如MySQL里面有一份,然后實時同步到ES,這樣一個用於鍵值查詢,一個用於各種其他查詢。 如果ES升級了之類的,比如數據結構變了,那么老版本數據可以不要,直接MySQL再導入一份到新版本,還可以恢復。 logstash的同步插件如logstash_input_jdbc 不支持同步刪除操作,建議改為更新操作加標記flag,或者通過業務邏輯實現同步刪除操作。

核心操作:

ES中只存儲檢索字段,利於快速檢索、全文檢索。 MySQL中存儲全部字段,利用ACID事務特性保證數據准確性。 通過關聯字段建立關聯,比如:productId在ES和mysql中要有相同的值。 核心數據先通過ES快速獲取Id(如product_id),再通過MySQL查詢出詳細數據。

引申討論:如何做關系型數據庫和ES之間的數據同步。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM