一個高擴展、開源的全文檢索和分析引擎,它可以準實時地快速存儲、搜索、分析海量的數據。
全文檢索是指電腦索引程式透過掃描文章中的每一個字,對每一個字建立一個索引,指明該字在文章中出現的次數和位置,當使用者查詢時,檢索程式就根據事先建立的索引進行查找,並將查找的結果回饋給使用者的檢索方式。這個過程類似於透過字典中的檢索字表查字的過程。全文搜尋搜尋引擎資料庫中的資料
Mysql 只有term dictionary 這一層,是以b-tree 排序的方式儲存在磁碟上的。檢索一個 term 需要若干次的 random access 的磁碟操作。而 Lucene 在 term dictionary 的基礎上添加了 term index 來加速檢索,term index 以樹的形式緩存在內存中。從 term index 查到對應的 term dictionary 的 block 位置之後,再去磁碟上找 term,大大減少了磁碟的 random access 次數。另外:term index 在記憶體中是以 FST(finite state transducers)的形式保存的,其特點是非常節省記憶體。 Term dictionary 在磁碟上是以分 block 的方式保存的,一個 block 內部利用公共前綴壓縮,例如都是 Ab 開頭的單字就可以把 Ab 省去。這樣 term dictionary 可以比 b-tree 更節約磁碟空間。
我們採取MySQL 的資料存儲,利用MySQL 的事務特性維護資料一致性,使用ElasticSearch 進行資料匯集與查詢,此時es 與資料庫的同步方案就尤為重要。
流程
先加入商品入資料庫,新增商品成功後,商品入ES,若入ES 失敗,將失敗的商品ID 放入redis 的快取佇列,且失敗的商品ID入log 檔案(若出現redis 掛掉,可從日誌中取異常商品ID 然後再入ES),task 任務每秒刷新一下redis 快取佇列,若是從快取佇列中取到商品ID,則依照商品ID 從資料庫中取得商品資料然後入ES。
使用
logstash-input-jdbc 外掛程式同步資料庫,安裝,設定:建立一個.conf 文件,設定了要同步的資料庫和.sql 用於執行的sql 語句,最後把一個jdbc 驅動放到這個資料夾下,用來連接mysql 資料庫
【相關學習推薦:mysql教學】
elasticsearch 資料重複以及增量同步
在預設配置下,tracking_column 這個值是@timestamp ,存在elasticsearch 就是_id 值,是logstash 存入elasticsearch 的時間,這個值的主要作用類似mysql 的主鍵,是唯一的,但是我們的時間戳其實是一直在變的,所以我們每次使用select 語句查詢的資料都會存入elasticsearch 中,導致資料重複。
解決方法
在要查詢的表中,找主鍵或自增值的字段,將它設為_id 的值,因為_id 值是唯一的,所以,當有重複的_id 的時候,資料就不會重複
資料同步頻繁,影響mysql 資料庫效能
我們寫入jdbc.sql 檔的mysql 語句是寫死的,所以每次查詢的資料庫有很多是已經不需要去查詢的,尤其是每次select * from table; 的時候,對mysql 資料庫造成了非常大的壓力
解決:
(1 ) 根據業務需求,可以適當修改定時同步時間,我這裡對實時性相對要求較高,因此設定了10 分鐘schedule => “*/10 * * * *”
(2) 設定mysql 查詢範圍,防止大量的查詢拖死資料庫,在sql 語句這裡設定select * from WHERE autoid > :sql_last_value;
elasticsearch 儲存容量不斷上升
#elasticsearch 為了資料安全,接收到資料後,先將資料寫入記憶體和translog,然後再建立索引寫入到磁碟,這樣即使突然斷電,重啟後,還可以透過translog 恢復,不過這裡由於我們每次查詢都有很多重複的數據,而這些重複的資料又沒有寫入到elasticsearch 的索引中,所以就囤積了下來,導致elasticsearch 容量就不斷上升
解決:
查詢官網說會定期 refresh,會自動清理掉舊的日誌,因此可不做處理
增量同步和 mysql 範圍查詢導致 mysql 資料庫有修改時無法同步到先前的資料。
解決了mysql 每次都小範圍查詢,解決了資料庫壓力的問題,不過卻導致無法同步老數據的修改問題
解決:
可根據業務狀態來做,如果你資料庫是修改頻繁型,那隻能做全量更新了,但是高頻率大範圍掃描資料庫來做的索引還不如不做索引了(因為建立索引也是有成本的),我們做索引主要是針對一些資料量大,不常修改,很消耗資料庫效能的情況。我這裡是資料修改較少,而且修改也一般是近期數據,因為同步時,我在mysql 範圍上面稍微調整一下
php composer 安裝composer require elasticsearch/elasticsearch
引入es 文件autoload.php 文件,設定IP 位址
建立index,index 對應關係型資料(以下簡稱MySQL)裡面的資料庫,而不是對應MySQL 裡面的索引
有了資料庫還不行,還需要建立表,ES 也是一樣的,ES 中的type 對應MySQL 裡面的表。 type 不是單獨定義的,而是和欄位一起定義,欄位定義在body 中;當然可以在body 欄位中也能使用ik 分詞;
使用EsClient->search () 實作搜尋;
同義詞和近義詞的使用
【相關學習推薦:php程式設計##(影片)】
在es 目錄下的plugins 在建立ik 目錄,把下載ik 的zip 套件所有檔案解壓縮進去。
進去 es 的 config 目錄,編輯 elasticsearch.yml,在空白地方加上 index.analysis.analyzer.default.type : “ik” 即可。
拼音分詞器配置:使用已經編譯好的:elasticsearch-analysis-pinyin-1.3.0
在elasticsearch 的plugins 目錄下,新建analysis-pinyin 資料夾,解壓縮壓縮包,將裡面的jar 包放到analysis-pinyin 資料夾。
在elasticsearch.yml 裡面配置拼音分詞器的過濾器
設定同義詞庫,在elasticsearch 的config 目錄下新建sysnonym.txt。
配置ik pinying 同義詞的分詞器,主要有分詞器的名稱,類型,分割詞元的組件,對分割的次元做處理:這裡使用的是拼音和同義詞
2) 節點轉送給個分片,查詢每個分片上的前10 個
3) 結果傳回給節點,整合數據,提取前10 條
4) 傳回給請求客戶端
當我們查詢第10 條到第20 條的資料時,有兩種方式,包括深度分頁(from-size) 和快照分頁(scroll);
深度分頁(from-size)
流程:
##想了解更多程式設計學習,請關注php培訓欄位!
以上是ES在MySQL、PHP的使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!