一、ElasticSearch - PHP 操作 ES 索引

作者: 温新

分类: 【Elasticsearch】

阅读: 2227

时间: 2023-02-22 07:59:52

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);
}
请登录后再评论