一架梯子,一头程序猿,仰望星空!

php elasticsearch 教程


php elasticsearch教程,主要从php角度讲解elasticsearch的增删改查等操作。

提示:如果不熟悉Elasticsearch的相关概念和查询语法,请参考:Elasticsearch 教程,这里不再重复介绍ES的核心概念和查询语法。

php elasticsearch 教程,主要围绕ES官方php客户端进行讲解。

版本说明

注意自己的Php版本和Elasticsearch版本的对应关系,选择合适的php elasticsearch客户端版本。

Elasticsearch版本php ES客户端版本php版本
>= 7.0, < 8.0>= 7.0> 7.1
>= 6.6, ⇐ 6.76.7.x> 7.0
>= 6.0, ⇐ 6.56.5.x> 7.0
>= 5.0, < 6.05.5.0> 5.6, < 7.0

最新的php es客户端版本是:7.8.0, 需要Php7.1以上,如果需要支持es 5版本,选择es客户端版本5.5.0即可,php5.6就可以使用。

安装依赖

使用Composer方式安装

依赖配置

{
    "require": {
        "elasticsearch/elasticsearch": "~7.0"
    }
}

安装

切换到项目目录,执行命令。

php composer install

提示:关于composer命令路径,安装composer后,将composer命令路径添加到PATH环境变量即可。

加载依赖

在php入口文件,加载autoload脚本,就可以自动加载composer安装的第三方包。

require 'vendor/autoload.php';

创建client

在使用ES之前,需要先创建一个ES client对象,用于配置Elasticsearch连接地址,账号、密码、发送ES请求等等。

use Elasticsearch\ClientBuilder;

// ES服务端配置,这里配置两个ES服务地址,这里是免密码访问的配置方式。
$hosts = [
    'localhost:9200', 
    'localhost:9201', 
];

$client = ClientBuilder::create()           // 实例化一个ClientBuilder对象,通过他配置client
                    ->setHosts($hosts)      // 设置ES服务端配置
                    ->build();              // 创建Client

插入文档

$params = [
    'index' => 'my_index', // 索引名
    'id'    => 'my_id', // 文档id
    'body'  => ['testField' => 'abc'] // 文档内容,最终会转成json,因此支持任意结构
];

// 通过client::index方法,插入文档,如果
$response = $client->index($params);
print_r($response);

输出结果

Array
(
    [_index] => my_index // 索引名
    [_type] => _doc // 新版ES已经没什么作用了
    [_id] => my_id // 文档id
    [_version] => 1 // 文档版本号
    [created] => 1
)

提示:es 的index操作,除了插入文档,其实也可以更新文档,如果文档id,已经存在就会更新文档,不过这里的更新操作是全量更新,就是新更新的文档内容会覆盖掉老的文档,而不是局部更新,例如:老的文档内容包含order_id,title两个字段,通过index更新title字段内容,那么新的文档内容只有title字段,order_id字段被丢去了,如果非要使用index实现更新操作,则需要把所有老的字段都写一遍。

读取文档

根据文档id查询内容

$params = [
    'index' => 'my_index',// 索引名 
    'id'    => 'my_id' // 需要查询的文档id
];

// 执行请求
$response = $client->get($params);
print_r($response);

输出结果

Array
(
    [_index] => my_index // 索引名
    [_type] => _doc
    [_id] => my_id // 文档id
    [_version] => 1
    [found] => 1
    [_source] => Array  // 文档内容
        (
            [testField] => abc
        )

)

搜索文档

$params = [
    'index' => 'my_index',  // 索引名
    'body'  => [ // ES查询语法
        'query' => [
            'match' => [
                'testField' => 'abc'
            ]
        ]
    ]
];

// 执行ES请求
$response = $client->search($params);
print_r($response);

输出结果

Array
(
    [took] => 1   // 执行时间
    [timed_out] => // 是否超时
    [_shards] => Array  
        (
            [total] => 5
            [successful] => 5
            [failed] => 0
        )

    [hits] => Array  // 搜索结果
        (
            [total] => 1   // 匹配文档数量
            [max_score] => 0.30685282 // 匹配分值
            [hits] => Array  // 匹配文档内容数组,下面就是匹配的一个个文档内容
                (
                    [0] => Array
                        (
                            [_index] => my_index
                            [_type] => _doc
                            [_id] => my_id
                            [_score] => 0.30685282
                            [_source] => Array
                                (
                                    [testField] => abc
                                )
                        )
                )
        )
)

删除文档

$params = [
    'index' => 'my_index', // 索引名
    'id'    => 'my_id' // 文档id
];

// 执行删除请求
$response = $client->delete($params);
print_r($response);

输出结果

Array
(
    [found] => 1 // 是否匹配文档
    [_index] => my_index // 索引名
    [_type] => _doc
    [_id] => my_id // 删除的文档id
    [_version] => 2
)

删除索引

$deleteParams = [
    'index' => 'my_index' // 索引名
];
$response = $client->indices()->delete($deleteParams);
print_r($response);

输出

Array
(
    [acknowledged] => 1 // es服务端接受处理
)

其他详细介绍,请参考后续章节。