您好,登錄后才能下訂單哦!
這篇文章主要介紹“Laravel8 ES怎么封裝及使用”,在日常操作中,相信很多人在Laravel8 ES怎么封裝及使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Laravel8 ES怎么封裝及使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
composer 安裝
composer require elasticsearch/elasticsearch
ES 封裝
將數據表中所有數據添加至 ES 每在 MySQL 里添加一條數據,在 es 里也添加一條<?php
namespace App\Es;
use Elasticsearch\ClientBuilder;
class MyEs
{
//ES客戶端鏈接
private $client;
/**
* 構造函數
* 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 (\Elasticsearch\Common\Exceptions\BadRequest400Exception $e) {
$msg = $e->getMessage();
$msg = json_decode($msg,true);
return $msg;
}
}
/**
* 創建索引
* @param string $index_name
* @return array|mixed|string
*/
public function create_index($index_name = 'test_ik') { // 只能創建一次
$params = [
'index' => $index_name,
'body' => [
'settings' => [
'number_of_shards' => 5,
'number_of_replicas' => 1
]
]
];
try {
return $this->client->indices()->create($params);
} catch (\Elasticsearch\Common\Exceptions\BadRequest400Exception $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 style="color: red">'
],
'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;
}
}
public function esAdd()
{
$data = Good::get()->toArray();
$es = new MyEs();
if (!$es->exists_index('goods')) {
//創建es索引,es的索引相當于MySQL的數據庫
$es->create_index('goods');
}
foreach ($data as $model) {
$es->add_doc($model['id'], $model, 'goods', '_doc');
}
}
直接將代碼補在 MySQL 添加入庫的邏輯方法里即可
進行 MySQL 數據修改時,也更新 es 的數據 //添加至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 修改數據的邏輯方法里即可
通過 ES 實現搜索功能 另,補充 es 分頁搜索 //修改MySQL的數據
$res=Good::where('id',$id)->update($arr);
$es = new MyEs();
if (!$es->exists_index('goods')) {
$es->create_index('goods');
}
//修改es的數據
$es->update_doc($id, 'goods', '_doc',['doc'=>$arr]);
return $res;
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 style="color: red">'
],
'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;
}
如果是在微信小程序中使用的話,運用上拉觸底事件即可
此功能是在上面搜索功能之上添加代碼實現的
1. 接收前臺小程序傳遞來的當前頁
2. 調用 es 封裝類的搜索方法時,多傳兩個參數
3. 在 es 封裝類的搜索方法中增加兩個形參
搜索后搜索值高亮顯示
如果是在微信小程序中使用的話,是直接將標簽和值一起輸出到頁面的,加入解析富文本的標簽可以將標簽轉化格式,達到高亮效果
<rich-text nodes="{{item.title}}"></rich-text>
到此,關于“Laravel8 ES怎么封裝及使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。