一、ElasticSearch - PHP 操作 ES 索引
hi,我是温新,一名 PHPer
ES 版本:ElasticSearch 8.6.0
系统版本:Rocky Linux 9.1
学习目标:使用 PHP(Laravel 10) 对索引进行相关操作
本篇文章结合官方文档编写及参考网络资料编写,虽非全部原创,但也是结合了自己的理解,若转载请附带本文 URL,编写不易,持续编写更不易,谢谢!
本篇文章的主要是学习 PHP 操作 ES,我这里使用的是 Laravel 10
+ "elasticsearch/elasticsearch": "^8.6"
。
关于 ES 的操作,全都会在 EsController.php 这个文件中完成,因此后面的操作只会列出单独的方法,而不是整个文件内容,如添加索引,这个片段只会出现添加索引的这部分代码。
安装依赖包
composer require elasticsearch/elasticsearch
连接 ES 客户端
<?php
namespace App\Http\Controllers;
use Elastic\Elasticsearch\ClientBuilder;
use Illuminate\Http\Request;
class EsController extends Controller
{
private $client;
public function __construct()
{
$hosts = ['127.0.0.1:9200'];
// 连接 ES
$this->client = ClientBuilder::create()
->setHosts($hosts)
->build();
}
}
判断索引是否存在
// 判断索引是否存在
public function indexEsists(string $indexName = 'huangyu'): bool
{
$index = ['index' => $indexName];
$response = $this->responseEsArray($this->client->indices()->exists($index));
return $response == 'OK' ? true : false;
}
创建索引
// 添加索引
public function addIndex()
{
$params = [
// 索引名称
'index'=>'huangyu1111142',
'body' => [
// settings 可以为空数组,但不能不写
"settings" => [
// 分片数量
'number_of_shards' => 1,
// 副本数量
'number_of_replicas' => 0,
]
],
];
// 创建索引
$response = $this->client->indices()->create($params);
$result = json_decode($response->getBody(), true);
return response()->json($result);
}
添加索引 & 映射
public function addIndexMapping()
{
$params = [
// 索引名称
'index'=>'php_articles',
'body' => [
// settings 可以为空数组,但不能不写
'settings' => [
// 分片数量
'number_of_shards' => 1,
// 副本数量
'number_of_replicas' => 0,
],
'mappings' => [
'properties' => [
'title' => [
'type' => 'text',
'analyzer' => 'ik_max_word'
],
'description' => [
'type' => 'keyword'
]
]
]
],
];
// 创建索引 & 映射
$response = $this->client->indices()->create($params);
$result = json_decode($response->getBody(), true);
return response()->json($result);
}
查询索引
1、查询指定索引
// 查询指定索引
public function searchIndex()
{
$index = $this->client->indices()->get(['index'=>'ziruchu']);
return json_decode($index->getBody(), true);
}
2、查询所有索引的 mappings
// 查询所有索引的 mappings
public function searchIndex()
{
$index = $this->client->indices()->getMapping();
return json_decode($index->getBody(), true);
}
返回值:
{
"ziruchu": {
"mappings": {
"properties": {
"age": {
"type": "long"
},
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
},
"php_articles": {
"mappings": {
"properties": {
"description": {
"type": "keyword"
},
"title": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
},
}
3、查询多个索引
// 查询多个索引的 mappings
public function searchIndex()
{;
$param = [
'index' => ['ziruchu', 'php_articles']
];
$index = $this->client->indices()->getMapping($param);
return json_decode($index->getBody(), true);
}
修改索引
// 修改索引设置
public function updateIndex()
{
$params = [
'index' => 'php_articles',
'body' => [
'settings' => [ // 修改设置
'number_of_replicas' => 2, // 副本数
]
]
];
$response = $this->client->indices()->putSettings($params);
return json_decode($response->getBody(), true);
}
删除索引
// 删除索引
public function deleteIndex()
{
$params = [
'index' => 'huangyu'
];
$response = $this->client->indices()->delete($params);
return json_decode($response->getBody(), true);
}
分词查询
// 分词查询
public function analyzeSearch()
{
$params = [
"index" => 'hy_test',
'body' => [
'analyzer' => 'ik_max_word',
'text' => '王美丽今天出去溜达了'
]
];
$response = $this->client->indices()->analyze($params);
$result = json_decode($response->getBody(), true);
return response()->json($result);
}
请登录后再评论