中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

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

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

                                                       

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

ES簡介

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

ES 為什么比 mysql 快

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 數據庫

可能遇到的問題

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 使用 ES

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

配置分詞器:配置 IK

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

ES 關鍵字高亮顯示

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

ES 查詢分頁

Elasticsearch 中數據都存儲在分片中,當執行搜索時每個分片獨立搜索后,數據再經過整合返回。

一般查詢流程為

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

from 定義了目標數據的偏移值,size 定義當前返回的事件數目。默認 from 為 0,size 為 10,也就是說所有的查詢默認僅僅返回前 10 條數據。查詢前 20 條數據,然后截斷前 10 條,只返回 10-20 的數據。浪費了前 10 條的查詢。越往后的分頁,執行的效率越低。分頁的偏移值越大,執行分頁查詢時間就會越長

快照分頁 (scroll)

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

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临江市| 三门县| 马关县| 蒲江县| 陕西省| 成都市| 镇远县| 翼城县| 八宿县| 德兴市| 通渭县| 江源县| 毕节市| 聂拉木县| 保定市| 安仁县| 三江| 双城市| 徐州市| 宝丰县| 始兴县| 桂平市| 龙陵县| 新疆| 大方县| 民勤县| 清水县| 东明县| 康保县| 韩城市| 寻乌县| 南投县| 新田县| 元氏县| 肇州县| 庄浪县| 芜湖县| 勐海县| 木里| 南城县| 德庆县|