本篇文章給大家介紹有關laravel8的相關知識,內容包括講解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()->setHosts(['127.0.0.1:9200'])->build(); ????} ????/** ?????*?判斷索引是否存在 ?????*?@param?string?$index_name ?????*?@return?bool|mixed|string ?????*/ ????public?function?exists_index($index_name?=?'test_ik') ????{ ????????$params?=?[ ????????????'index'?=>?$index_name ????????]; ????????try?{ ????????????return?$this->client->indices()->exists($params); ????????}?catch?(ElasticsearchCommonExceptionsBadRequest400Exception?$e)?{ ????????????$msg?=?$e->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'?=>?$index_name, ????????????'body'?=>?[ ????????????????'settings'?=>?[ ????????????????????'number_of_shards'?=>?5, ????????????????????'number_of_replicas'?=>?1 ????????????????] ????????????] ????????]; ????????try?{ ????????????return?$this->client->indices()->create($params); ????????}?catch?(ElasticsearchCommonExceptionsBadRequest400Exception?$e)?{ ????????????$msg?=?$e->getMessage(); ????????????$msg?=?json_decode($msg,true); ????????????return?$msg; ????????} ????} ????/** ?????*?刪除索引 ?????*?@param?string?$index_name ?????*?@return?array ?????*/ ????public?function?delete_index($index_name?=?'test_ik')?{ ????????$params?=?['index'?=>?$index_name]; ????????$response?=?$this->client->indices()->delete($params); ????????return?$response; ????} ????/** ?????*?添加文檔 ?????*?@param?$id ?????*?@param?$doc?['id'=>100,?'title'=>'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'?=>?$index_name, ????????????'type'?=>?$type_name, ????????????'id'?=>?$id, ????????????'body'?=>?$doc ????????]; ????????$response?=?$this->client->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'?=>?$index_name, ????????????'type'?=>?$type_name, ????????????'id'?=>?$id ????????]; ????????$response?=?$this->client->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'?=>?$index_name, ????????????'type'?=>?$type_name, ????????????'id'?=>?$id ????????]; ????????$response?=?$this->client->get($params); ????????return?$response; ????} ????/** ?????*?更新文檔 ?????*?@param?int?$id ?????*?@param?string?$index_name ?????*?@param?string?$type_name ?????*?@param?array?$body?['doc'?=>?['title'?=>?'蘋果手機iPhoneX']] ?????*?@return?array ?????*/ ????public?function?update_doc($id?=?1,$index_name?=?'test_ik',$type_name?=?'goods',?$body=[])?{ ????????//?可以靈活添加新字段,最好不要亂添加 ????????$params?=?[ ????????????'index'?=>?$index_name, ????????????'type'?=>?$type_name, ????????????'id'?=>?$id, ????????????'body'?=>?$body ????????]; ????????$response?=?$this->client->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'?=>?$index_name, ????????????'type'?=>?$type_name, ????????????'id'?=>?$id ????????]; ????????$response?=?$this->client->delete($params); ????????return?$response; ????} ????/** ?????*?搜索文檔?(分頁,排序,權重,過濾) ?????*?@param?string?$index_name ?????*?@param?string?$type_name ?????*?@param?array?$body ?????*?$body?=?[ ????????????????'query'?=>?[ ????????????????????'match'?=>?[ ????????????????????????'fang_name'?=>?[ ????????????????????????????'query'?=>?$fangName ????????????????????????] ????????????????????] ????????????????], ????????????????'highlight'=>[ ????????????????????'fields'=>[ ????????????????????????'fang_name'=>[ ????????????????????????????'pre_tags'=>[ ????????????????????????????????'<span>' ????????????????????????????], ????????????????????????????'post_tags'=>[ ????????????????????????????????'</span>' ????????????????????????????] ????????????????????????] ????????????????????] ????????????????] ????????????]; ?????*?@return?array ?????*/ ????public?function?search_doc($index_name?=?"test_ik",$type_name?=?"goods",$body=[])?{ ????????$params?=?[ ????????????'index'?=>?$index_name, ????????????'type'?=>?$type_name, ????????????'body'?=>?$body ????????]; ????????$results?=?$this->client->search($params); ????????return?$results; ????} }
將數(shù)據(jù)表中所有數(shù)據(jù)添加至 ES
public?function?esAdd() ????{ ????????$data?=?Good::get()->toArray(); ????????$es?=?new?MyEs(); ????????if?(!$es->exists_index('goods'))?{ ????????????//創(chuàng)建es索引,es的索引相當于MySQL的數(shù)據(jù)庫 ????????????$es->create_index('goods'); ????????} ????????foreach?($data?as?$model)?{ ????????????$es->add_doc($model['id'],?$model,?'goods',?'_doc'); ????????} ????}
每在 MySQL 里添加一條數(shù)據(jù),在 es 里也添加一條
直接將代碼補在 MySQL 添加入庫的邏輯方法里即可
????????//添加至MySQL ????????$res=Good::insertGetId($arr); ????????$es?=?new?MyEs(); ????????if?(!$es->exists_index('goods'))?{ ????????????$es->create_index('goods'); ????????} ????????//添加至es ????????$es->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)->update($arr); ????????$es?=?new?MyEs(); ????????if?(!$es->exists_index('goods'))?{ ????????????$es->create_index('goods'); ????????} ????????//修改es的數(shù)據(jù) ????????$es->update_doc($id,?'goods',?'_doc',['doc'=>$arr]); ????????return?$res;
通過 ES 實現(xiàn)搜索功能
public?function?search() ????{ ????????//獲取搜索值 ????????$search?=?request()->get('search'); ????????if?(!empty($search))?{ ????????????$es?=?new?MyEs(); ????????????$body?=?[ ????????????????'query'?=>?[ ????????????????????'match'?=>?[ ????????????????????????'title'?=>?[ ????????????????????????????'query'?=>?$search ????????????????????????] ????????????????????] ????????????????], ????????????????'highlight'=>[ ????????????????????'fields'=>[ ????????????????????????'title'=>[ ????????????????????????????'pre_tags'=>[ ????????????????????????????????'<span>' ????????????????????????????], ????????????????????????????'post_tags'=>[ ????????????????????????????????'</span>' ????????????????????????????] ????????????????????????] ????????????????????] ????????????????] ????????????]; ????????????$res?=?$es->search_doc('goods',?'_doc',?$body); ????????????$data?=?array_column($res['hits']['hits'],?'_source'); ????????????foreach?($data?as?$key=>&$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
? 版權聲明
文章版權歸作者所有,未經(jīng)允許請勿轉載。
THE END