真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

ES在MySQL、PHP中的使用

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、永靖網(wǎng)絡(luò)推廣、小程序制作、永靖網(wǎng)絡(luò)營銷、永靖企業(yè)策劃、永靖品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供永靖建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.comES簡(jiǎn)介

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

ES 為什么比 mysql 快

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

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

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

流程

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

使用

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

【相關(guān)學(xué)習(xí)推薦:mysql教程】

可能遇到的問題

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

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

解決方法

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

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

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

解決:

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

elasticsearch 存儲(chǔ)容量不斷上升

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

解決:

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

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

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

解決:

可根據(jù)業(yè)務(wù)狀態(tài)來做,如果你數(shù)據(jù)庫是修改頻繁類型,那只能做全量更新了,但是高頻率大范圍掃描數(shù)據(jù)庫來做的索引還不如不做索引了 (因?yàn)榻⑺饕彩怯谐杀镜?,我們做索引主要是針對(duì)一些數(shù)據(jù)量大,不常修改,很消耗數(shù)據(jù)庫性能的情況。我這里是數(shù)據(jù)修改較少,而且修改也一般是近期數(shù)據(jù),因?yàn)橥綍r(shí),我在 mysql 范圍上面稍微調(diào)整一下

php 使用 ES

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

【相關(guān)學(xué)習(xí)推薦:php編程(視頻)】

配置分詞器:配置 IK

下載 es 的 ik 版本包
在 es 目錄下的 plugins 在創(chuàng)建 ik 目錄,把下載 ik 的 zip 包所有文件解壓進(jìn)去。
進(jìn)去 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 + 同義詞的分詞器,主要有分詞器的名稱,類型,分割詞元的組件,對(duì)分割的次元做處理:這里使用的是拼音和同義詞

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

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

ES 查詢分頁

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

一般查詢流程為

1) 客戶端請(qǐng)求發(fā)給某個(gè)節(jié)點(diǎn)
2) 節(jié)點(diǎn)轉(zhuǎn)發(fā)給個(gè)個(gè)分片,查詢每個(gè)分片上的前 10 條
3) 結(jié)果返回給節(jié)點(diǎn),整合數(shù)據(jù),提取前 10 條
4) 返回給請(qǐng)求客戶端
當(dāng)我們查詢第 10 條到第 20 條的數(shù)據(jù)時(shí),有兩種方式,包括深度分頁 (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ù),然后截?cái)嗲?10 條,只返回 10-20 的數(shù)據(jù)。浪費(fèi)了前 10 條的查詢。越往后的分頁,執(zhí)行的效率越低。分頁的偏移值越大,執(zhí)行分頁查詢時(shí)間就會(huì)越長

快照分頁 (scroll)

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

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

想了解更多編程學(xué)習(xí),敬請(qǐng)關(guān)注php培訓(xùn)欄目!


當(dāng)前文章:ES在MySQL、PHP中的使用
瀏覽路徑:http://weahome.cn/article/chsjii.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部