詳解Laravel8 ES封裝及其使用方法

本篇文章給大家介紹有關laravel8的相關知識,內容包括講解laravel8 es封裝以及使用方法,希望對大家有所幫助!

詳解Laravel8 ES封裝及其使用方法

【相關推薦:laravel視頻教程

composer 安裝

composer?require?elasticsearch/elasticsearch

ES 封裝

<?php namespace AppEs; use ElasticsearchClientBuilder; class MyEs {     //ES客戶端鏈接     private $client;     /**      * 構造函數(shù)      * MyElasticsearch constructor.      */     public function __construct()     {         $this->client?=?ClientBuilder::create()-&gt;setHosts(['127.0.0.1:9200'])-&gt;build(); ????} ????/** ?????*?判斷索引是否存在 ?????*?@param?string?$index_name ?????*?@return?bool|mixed|string ?????*/ ????public?function?exists_index($index_name?=?'test_ik') ????{ ????????$params?=?[ ????????????'index'?=&gt;?$index_name ????????]; ????????try?{ ????????????return?$this-&gt;client-&gt;indices()-&gt;exists($params); ????????}?catch?(ElasticsearchCommonExceptionsBadRequest400Exception?$e)?{ ????????????$msg?=?$e-&gt;getMessage(); ????????????$msg?=?json_decode($msg,true); ????????????return?$msg; ????????} ????} ????/** ?????*?創(chuàng)建索引 ?????*?@param?string?$index_name ?????*?@return?array|mixed|string ?????*/ ????public?function?create_index($index_name?=?'test_ik')?{?//?只能創(chuàng)建一次 ????????$params?=?[ ????????????'index'?=&gt;?$index_name, ????????????'body'?=&gt;?[ ????????????????'settings'?=&gt;?[ ????????????????????'number_of_shards'?=&gt;?5, ????????????????????'number_of_replicas'?=&gt;?1 ????????????????] ????????????] ????????]; ????????try?{ ????????????return?$this-&gt;client-&gt;indices()-&gt;create($params); ????????}?catch?(ElasticsearchCommonExceptionsBadRequest400Exception?$e)?{ ????????????$msg?=?$e-&gt;getMessage(); ????????????$msg?=?json_decode($msg,true); ????????????return?$msg; ????????} ????} ????/** ?????*?刪除索引 ?????*?@param?string?$index_name ?????*?@return?array ?????*/ ????public?function?delete_index($index_name?=?'test_ik')?{ ????????$params?=?['index'?=&gt;?$index_name]; ????????$response?=?$this-&gt;client-&gt;indices()-&gt;delete($params); ????????return?$response; ????} ????/** ?????*?添加文檔 ?????*?@param?$id ?????*?@param?$doc?['id'=&gt;100,?'title'=&gt;'phone'] ?????*?@param?string?$index_name ?????*?@param?string?$type_name ?????*?@return?array ?????*/ ????public?function?add_doc($id,$doc,$index_name?=?'test_ik',$type_name?=?'goods')?{ ????????$params?=?[ ????????????'index'?=&gt;?$index_name, ????????????'type'?=&gt;?$type_name, ????????????'id'?=&gt;?$id, ????????????'body'?=&gt;?$doc ????????]; ????????$response?=?$this-&gt;client-&gt;index($params); ????????return?$response; ????} ????/** ?????*?判斷文檔存在 ?????*?@param?int?$id ?????*?@param?string?$index_name ?????*?@param?string?$type_name ?????*?@return?array|bool ?????*/ ????public?function?exists_doc($id?=?1,$index_name?=?'test_ik',$type_name?=?'goods')?{ ????????$params?=?[ ????????????'index'?=&gt;?$index_name, ????????????'type'?=&gt;?$type_name, ????????????'id'?=&gt;?$id ????????]; ????????$response?=?$this-&gt;client-&gt;exists($params); ????????return?$response; ????} ????/** ?????*?獲取文檔 ?????*?@param?int?$id ?????*?@param?string?$index_name ?????*?@param?string?$type_name ?????*?@return?array ?????*/ ????public?function?get_doc($id?=?1,$index_name?=?'test_ik',$type_name?=?'goods')?{ ????????$params?=?[ ????????????'index'?=&gt;?$index_name, ????????????'type'?=&gt;?$type_name, ????????????'id'?=&gt;?$id ????????]; ????????$response?=?$this-&gt;client-&gt;get($params); ????????return?$response; ????} ????/** ?????*?更新文檔 ?????*?@param?int?$id ?????*?@param?string?$index_name ?????*?@param?string?$type_name ?????*?@param?array?$body?['doc'?=&gt;?['title'?=&gt;?'蘋果手機iPhoneX']] ?????*?@return?array ?????*/ ????public?function?update_doc($id?=?1,$index_name?=?'test_ik',$type_name?=?'goods',?$body=[])?{ ????????//?可以靈活添加新字段,最好不要亂添加 ????????$params?=?[ ????????????'index'?=&gt;?$index_name, ????????????'type'?=&gt;?$type_name, ????????????'id'?=&gt;?$id, ????????????'body'?=&gt;?$body ????????]; ????????$response?=?$this-&gt;client-&gt;update($params); ????????return?$response; ????} ????/** ?????*?刪除文檔 ?????*?@param?int?$id ?????*?@param?string?$index_name ?????*?@param?string?$type_name ?????*?@return?array ?????*/ ????public?function?delete_doc($id?=?1,$index_name?=?'test_ik',$type_name?=?'goods')?{ ????????$params?=?[ ????????????'index'?=&gt;?$index_name, ????????????'type'?=&gt;?$type_name, ????????????'id'?=&gt;?$id ????????]; ????????$response?=?$this-&gt;client-&gt;delete($params); ????????return?$response; ????} ????/** ?????*?搜索文檔?(分頁,排序,權重,過濾) ?????*?@param?string?$index_name ?????*?@param?string?$type_name ?????*?@param?array?$body ?????*?$body?=?[ ????????????????'query'?=&gt;?[ ????????????????????'match'?=&gt;?[ ????????????????????????'fang_name'?=&gt;?[ ????????????????????????????'query'?=&gt;?$fangName ????????????????????????] ????????????????????] ????????????????], ????????????????'highlight'=&gt;[ ????????????????????'fields'=&gt;[ ????????????????????????'fang_name'=&gt;[ ????????????????????????????'pre_tags'=&gt;[ ????????????????????????????????'<span>' ????????????????????????????], ????????????????????????????'post_tags'=&gt;[ ????????????????????????????????'</span>' ????????????????????????????] ????????????????????????] ????????????????????] ????????????????] ????????????]; ?????*?@return?array ?????*/ ????public?function?search_doc($index_name?=?"test_ik",$type_name?=?"goods",$body=[])?{ ????????$params?=?[ ????????????'index'?=&gt;?$index_name, ????????????'type'?=&gt;?$type_name, ????????????'body'?=&gt;?$body ????????]; ????????$results?=?$this-&gt;client-&gt;search($params); ????????return?$results; ????} }

將數(shù)據(jù)表中所有數(shù)據(jù)添加至 ES

public?function?esAdd() ????{ ????????$data?=?Good::get()-&gt;toArray(); ????????$es?=?new?MyEs(); ????????if?(!$es-&gt;exists_index('goods'))?{ ????????????//創(chuàng)建es索引,es的索引相當于MySQL的數(shù)據(jù)庫 ????????????$es-&gt;create_index('goods'); ????????} ????????foreach?($data?as?$model)?{ ????????????$es-&gt;add_doc($model['id'],?$model,?'goods',?'_doc'); ????????} ????}

每在 MySQL 里添加一條數(shù)據(jù),在 es 里也添加一條

直接將代碼補在 MySQL 添加入庫的邏輯方法里即可

????????//添加至MySQL ????????$res=Good::insertGetId($arr); ????????$es?=?new?MyEs(); ????????if?(!$es-&gt;exists_index('goods'))?{ ????????????$es-&gt;create_index('goods'); ????????} ????????//添加至es ????????$es-&gt;add_doc($res,?$arr,?'goods',?'_doc'); ????????return?$res;

進行 MySQL 數(shù)據(jù)修改時,也更新 es 的數(shù)據(jù)

直接將代碼補在 MySQL 修改數(shù)據(jù)的邏輯方法里即可

??????//修改MySQL的數(shù)據(jù) ????????$res=Good::where('id',$id)-&gt;update($arr); ????????$es?=?new?MyEs(); ????????if?(!$es-&gt;exists_index('goods'))?{ ????????????$es-&gt;create_index('goods'); ????????} ????????//修改es的數(shù)據(jù) ????????$es-&gt;update_doc($id,?'goods',?'_doc',['doc'=&gt;$arr]); ????????return?$res;

通過 ES 實現(xiàn)搜索功能

public?function?search() ????{ ????????//獲取搜索值 ????????$search?=?request()-&gt;get('search'); ????????if?(!empty($search))?{ ????????????$es?=?new?MyEs(); ????????????$body?=?[ ????????????????'query'?=&gt;?[ ????????????????????'match'?=&gt;?[ ????????????????????????'title'?=&gt;?[ ????????????????????????????'query'?=&gt;?$search ????????????????????????] ????????????????????] ????????????????], ????????????????'highlight'=&gt;[ ????????????????????'fields'=&gt;[ ????????????????????????'title'=&gt;[ ????????????????????????????'pre_tags'=&gt;[ ????????????????????????????????'<span>' ????????????????????????????], ????????????????????????????'post_tags'=&gt;[ ????????????????????????????????'</span>' ????????????????????????????] ????????????????????????] ????????????????????] ????????????????] ????????????]; ????????????$res?=?$es-&gt;search_doc('goods',?'_doc',?$body); ????????????$data?=?array_column($res['hits']['hits'],?'_source'); ????????????foreach?($data?as?$key=&gt;&amp;$v){ ?????????????????$v['title']?=?$res['hits']['hits'][$key]['highlight']['title'][0]; ????????????} ????????????unset($v); ????????????return?$data; ????????} ????????$data?=?Good::get(); ????????return?$data; ????}

另,補充 es 分頁搜索

如果是在微信小程序中使用的話,運用上拉觸底事件即可

此功能是在上面搜索功能之上添加代碼實現(xiàn)的

1. 接收前臺小程序傳遞來的當前頁

2. 調用 es 封裝類的搜索方法時,多傳兩個參數(shù)

3. 在 es 封裝類的搜索方法中增加兩個形參

搜索后搜索值高亮顯示

如果是在微信小程序中使用的話,是直接將標簽和值一起輸出到頁面的,加入解析富文本的標簽可以將標簽轉化格式,達到高亮效果

<rich-text></rich-text>

原文作者:amateur轉自鏈接:https://learnku.com/articles/66177

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享