溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ES在MySQL、PHP中的使用方法是什么

發(fā)布時間:2020-09-04 14:53:24 來源:億速云 閱讀:234 作者:小新 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)ES在MySQL、PHP中的使用方法是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

                                                       

ES在MySQL、PHP中的使用方法是什么

ES簡介

一個高擴展、開源的全文檢索和分析引擎,它可以準(zhǔn)實時地快速存儲、搜索、分析海量的數(shù)據(jù)。
全文檢索是指計算機索引程序通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現(xiàn)的次數(shù)和位置,當(dāng)用戶查詢時,檢索程序就根據(jù)事先建立的索引進行查找,并將查找的結(jié)果反饋給用戶的檢索方式。這個過程類似于通過字典中的檢索字表查字的過程。全文搜索搜索引擎數(shù)據(jù)庫中的數(shù)據(jù)

ES 為什么比 mysql 快

Mysql 只有 term dictionary 這一層,是以 b-tree 排序的方式存儲在磁盤上的。檢索一個 term 需要若干次的 random access 的磁盤操作。而 Lucene 在 term dictionary 的基礎(chǔ)上添加了 term index 來加速檢索,term index 以樹的形式緩存在內(nèi)存中。從 term index 查到對應(yīng)的 term dictionary 的 block 位置之后,再去磁盤上找 term,大大減少了磁盤的 random access 次數(shù)。另外:term index 在內(nèi)存中是以 FST(finite state transducers)的形式保存的,其特點是非常節(jié)省內(nèi)存。Term dictionary 在磁盤上是以分 block 的方式保存的,一個 block 內(nèi)部利用公共前綴壓縮,比如都是 Ab 開頭的單詞就可以把 Ab 省去。這樣 term dictionary 可以比 b-tree 更節(jié)約磁盤空間。

同步數(shù)據(jù)庫

我們采取 MySQL 的數(shù)據(jù)存儲,利用 MySQL 的事務(wù)特性維護數(shù)據(jù)一致性,使用 ElasticSearch 進行數(shù)據(jù)匯集和查詢,此時 es 與數(shù)據(jù)庫的同步方案就尤為重要。

流程

首先添加商品入數(shù)據(jù)庫,添加商品成功后,商品入 ES,若入 ES 失敗,將失敗的商品 ID 放入 redis 的緩存隊列,且失敗的商品 ID 入 log 文件(若出現(xiàn) redis 掛掉,可從日志中取異常商品 ID 然后再入 ES),task 任務(wù)每秒刷新一下 redis 緩存隊列,若是從緩存隊列中取到商品 ID,則根據(jù)商品 ID 從數(shù)據(jù)庫中獲取商品數(shù)據(jù)然后入 ES。

使用

logstash-input-jdbc 插件同步數(shù)據(jù)庫,安裝,配置:創(chuàng)建一個 .conf 文件,配置了要同步的數(shù)據(jù)庫和.sql 用于執(zhí)行的 sql 語句,最后把一個 jdbc 驅(qū)動放到這個文件夾下,用來連接 mysql 數(shù)據(jù)庫

可能遇到的問題

elasticsearch 數(shù)據(jù)重復(fù)以及增量同步

在默認(rèn)配置下,tracking_column 這個值是 @timestamp,存在 elasticsearch 就是_id 值,是 logstash 存入 elasticsearch 的時間,這個值的主要作用類似 mysql 的主鍵,是唯一的,但是我們的時間戳其實是一直在變的,所以我們每次使用 select 語句查詢的數(shù)據(jù)都會存入 elasticsearch 中,導(dǎo)致數(shù)據(jù)重復(fù)。

解決方法

在要查詢的表中,找主鍵或者自增值的字段,將它設(shè)置為_id 的值,因為_id 值是唯一的,所以,當(dāng)有重復(fù)的_id 的時候,數(shù)據(jù)就不會重復(fù)

數(shù)據(jù)同步頻繁,影響 mysql 數(shù)據(jù)庫性能

我們寫入 jdbc.sql 文件的 mysql 語句是寫死的,所以每次查詢的數(shù)據(jù)庫有很多是已經(jīng)不需要去查詢的,尤其是每次 select * from table; 的時候,對 mysql 數(shù)據(jù)庫造成了非常大的壓力

解決:

(1) 根據(jù)業(yè)務(wù)需求,可以適當(dāng)修改定時同步時間,我這里對實時性相對要求較高,因此設(shè)置了 10 分鐘 schedule => “*/10 * * * *”
(2) 設(shè)置 mysql 查詢范圍,防止大量的查詢拖死數(shù)據(jù)庫,在 sql 語句這里設(shè)置 select * from WHERE autoid > :sql_last_value;

elasticsearch 存儲容量不斷上升

elasticsearch 為了數(shù)據(jù)安全,接收到數(shù)據(jù)后,先將數(shù)據(jù)寫入內(nèi)存和 translog,然后再建立索引寫入到磁盤,這樣即使突然斷電,重啟后,還可以通過 translog 恢復(fù),不過這里由于我們每次查詢都有很多重復(fù)的數(shù)據(jù),而這些重復(fù)的數(shù)據(jù)又沒有寫入到 elasticsearch 的索引中,所以就囤積了下來,導(dǎo)致 elasticsearch 容量就不斷上升

解決:

查詢官網(wǎng)說會定期 refresh,會自動清理掉老的日志,因此可不做處理

增量同步和 mysql 范圍查詢導(dǎo)致 mysql 數(shù)據(jù)庫有修改時無法同步到以前的數(shù)據(jù)。

解決了 mysql 每次都小范圍查詢,解決了數(shù)據(jù)庫壓力的問題,不過卻導(dǎo)致無法同步老數(shù)據(jù)的修改問題

解決:

可根據(jù)業(yè)務(wù)狀態(tài)來做,如果你數(shù)據(jù)庫是修改頻繁類型,那只能做全量更新了,但是高頻率大范圍掃描數(shù)據(jù)庫來做的索引還不如不做索引了 (因為建立索引也是有成本的),我們做索引主要是針對一些數(shù)據(jù)量大,不常修改,很消耗數(shù)據(jù)庫性能的情況。我這里是數(shù)據(jù)修改較少,而且修改也一般是近期數(shù)據(jù),因為同步時,我在 mysql 范圍上面稍微調(diào)整一下

php 使用 ES

php composer 安裝 composer require elasticsearch/elasticsearch
引入 es 文件 autoload.php 文件,設(shè)置 IP 地址
創(chuàng)建 index,index 對應(yīng)關(guān)系型數(shù)據(jù)(以下簡稱 MySQL)里面的數(shù)據(jù)庫,而不是對應(yīng) MySQL 里面的索引
有了數(shù)據(jù)庫還不行,還需要建立表,ES 也是一樣的,ES 中的 type 對應(yīng) MySQL 里面的表。type 不是單獨定義的,而是和字段一起定義,字段定義在 body 中;當(dāng)然可以在 body 字段中也能使用 ik 分詞;
使用 EsClient->search () 實現(xiàn)搜索;
同義詞和近義詞的使用

配置分詞器:配置 IK

下載 es 的 ik 版本包
在 es 目錄下的 plugins 在創(chuàng)建 ik 目錄,把下載 ik 的 zip 包所有文件解壓進去。
進去 es 的 config 目錄,編輯 elasticsearch.yml,在空白地方加上 index.analysis.analyzer.default.type : “ik” 即可。
拼音分詞器配置:使用已經(jīng)編譯好的:elasticsearch-analysis-pinyin-1.3.0
在 elasticsearch 的 plugins 目錄下,新建 analysis-pinyin 文件夾,解壓壓縮包,將里面的 jar 包放到 analysis-pinyin 文件夾。
在 elasticsearch.yml 里面配置拼音分詞器的過濾器

同義詞分詞器配置

在 elasticsearch.yml 里面配置好同義詞分詞器的過濾器
配置同義詞詞庫,在 elasticsearch 的 config 目錄下新建 sysnonym.txt。
配置 ik+pinying + 同義詞的分詞器,主要有分詞器的名稱,類型,分割詞元的組件,對分割的次元做處理:這里使用的是拼音和同義詞

ES 關(guān)鍵字高亮顯示

ES 通過在查詢的時候可以在查詢之后的字段數(shù)據(jù)加上 html 標(biāo)簽字段,使文檔在在 web 界面上顯示的時候是由顏色或者字體格式的,是在 highlight 修飾高亮字段, 這個部分包含了 name 屬性匹配的文本片段,并以 HTML 標(biāo)簽 封裝

ES 查詢分頁

Elasticsearch 中數(shù)據(jù)都存儲在分片中,當(dāng)執(zhí)行搜索時每個分片獨立搜索后,數(shù)據(jù)再經(jīng)過整合返回。

一般查詢流程為

1) 客戶端請求發(fā)給某個節(jié)點
2) 節(jié)點轉(zhuǎn)發(fā)給個個分片,查詢每個分片上的前 10 條
3) 結(jié)果返回給節(jié)點,整合數(shù)據(jù),提取前 10 條
4) 返回給請求客戶端
當(dāng)我們查詢第 10 條到第 20 條的數(shù)據(jù)時,有兩種方式,包括深度分頁 (from-size) 和快照分頁 (scroll);
深度分頁 (from-size)

from 定義了目標(biāo)數(shù)據(jù)的偏移值,size 定義當(dāng)前返回的事件數(shù)目。默認(rèn) from 為 0,size 為 10,也就是說所有的查詢默認(rèn)僅僅返回前 10 條數(shù)據(jù)。查詢前 20 條數(shù)據(jù),然后截斷前 10 條,只返回 10-20 的數(shù)據(jù)。浪費了前 10 條的查詢。越往后的分頁,執(zhí)行的效率越低。分頁的偏移值越大,執(zhí)行分頁查詢時間就會越長

快照分頁 (scroll)

相對于 from 和 size 的分頁來說,使用 scroll 可以模擬一個傳統(tǒng)數(shù)據(jù)的游標(biāo),記錄當(dāng)前讀取的文檔信息位置。這個分頁的用法,不是為了實時查詢數(shù)據(jù),而是為了一次性查詢大量的數(shù)據(jù)(甚至是全部的數(shù)據(jù))。因為這個 scroll 相當(dāng)于維護了一份當(dāng)前索引段的快照信息,這個快照信息是你執(zhí)行這個 scroll 查詢時的快照。在這個查詢后的任何新索引進來的數(shù)據(jù),都不會在這個快照中查詢到。但是它相對于 from 和 size,不是查詢所有數(shù)據(jù)然后剔除不要的部分,而是記錄一個讀取的位置,保證下一次快速繼續(xù)讀取。
流程:

  • 調(diào)用: index/type/_search?pretty&scroll=2m,返回一個 scroll 值
  • 直接用 scroll_id 進行查詢。
  • 清除 scroll,我們在設(shè)置開啟 scroll 時,設(shè)置了一個 scroll 的存活時間,但是如果能夠在使用完順手關(guān)閉,可以提早釋放資源,降低 ES 的負(fù)擔(dān)

關(guān)于ES在MySQL、PHP中的使用方法是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI