分类
elasticsearch php

php 简单操作 elasticsearch 7.6

  1. 连接 elasticsearch 服务。
class ElasticSearchServer {
    private static $serverObject = null;

    public static function getServer()
    {
        if( ! self::$serverObject){
            self::$serverObject = Elasticsearch\ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();
        }
        return self::$serverObject;
    }
}

Route::get('/elasticSearchClient', function () {
    $client = ElasticSearchServer::getServer();
    dd($client);
});

打印的信息如下

2. 生成文章索引,部分字段在存入内容时,采用的是 ik_max_word 分词策略,将内容拆成足够多的索引。
在查询的时候采用的是 ik_smart 分词策略,查询的字段较少的分词。来确保查询效率与查询进准度。

// 创建索引和映射
Route::get('/elasticSearchSetIndex', function () {
$client = ElasticSearchServer::getServer();
$params = [
'index' => 'articles', // 索引名称 - 相当于mysql的数据库名称
'body' => [
'settings' => [
'number_of_shards' => 6,
'number_of_replicas' => 1
],
'mappings' => [
'_source' => [
'enabled' => true
],
'properties' => [
'title' => [
'type' => 'text',
"analyzer" => "ik_max_word", // 建立索引时的分词库 细致分词
"search_analyzer" => "ik_smart", // 查询时使用的分词库 粗糙分词
],
'author' => [
'type' => 'text',
"analyzer" => "ik_max_word", // 建立索引时的分词库 细致分词
"search_analyzer" => "ik_smart", // 查询时使用的分词库 粗糙分词
],
'content' => [
'type' => 'text',
"analyzer" => "ik_max_word", // 建立索引时的分词库 细致分词
"search_analyzer" => "ik_smart", // 查询时使用的分词库 粗糙分词
],
'create_time' => [
'type' => 'date'
],
]
]
]
];

$response = $client->indices()->create($params);
dd($response);
});

打印信息如下:

3. 删除索引

Route::get('/elasticSearchDelete', function () {
$client = ElasticSearchServer::getServer();
$params = ['index' => 'articles'];
$response = $client->indices()->delete($params);
dd($response);
});

打印的信息如下:

4. 添加文档

Route::get('/elasticSearchAdd', function () {
$client = ElasticSearchServer::getServer();
$params = [
'index' => 'articles',
'type' => '_doc',
'id' => 1,
'body' => [
'title' => '第一篇文章',
'author' => '张三',
'content' => '假装第一篇文章的内容',
'create_time' => date('Y-m-d'),

]
];
$response = $client->index($params);
dd($response);
});

截图如下:

5. 获取与查询文档

Route::get('/elasticSearchGet', function () {
$client = ElasticSearchServer::getServer();

// 获取文章
$params1 = [
'index' => 'articles',
'type' => '_doc',
'id' => 1,
];
$response1 = $client->get($params1);


// 查询文章关键词,期望查询出来的内容包含第一篇文章与第二篇文章
$query = [
'query' => [
'bool' => [
'must' => [
'match' => [
'content' => '文章',
],
],
],
],
];
$params = [
'index' => 'articles',
'type' => '_doc',
// '_source' => ['title'], // 请求指定的字段
'body' => array_merge([
'from' => 0,
'size' => 5,
],$query),
];
$response2 = $client->search($params);


// 查询 第二aaaaa 关键词,期望查询出来的只有第二篇文章
$query = [
'query' => [
'bool' => [
'must' => [
'match' => [
'content' => '第二aaaaa',
],
],
],
],
];
$params = [
'index' => 'articles',
'type' => '_doc',
// '_source' => ['title'], // 请求指定的字段
'body' => array_merge([
'from' => 0,
'size' => 5,
],$query),
];
$response3 = $client->search($params);


dd([
'$response1' => $response1,
'$response2' => $response2,
'$response3' => $response3,
]);

});

打印的结果如下:
$repsonse1: 通过指定ID获取文章,没问题。

$repsonse2: 通过查询 “文章” 关键词 ,期望查询出来的是第一篇与第二篇文章。结果如下,没问题。

$repsonse3: 通过查询“第二aaaaa” 关键词,期望查询出来的只有第二篇文章。结果如下,也没问题。

那么 php-elasticsearch 7.6 的简单使用就先进行到这里。
只要数据能按照期望的分词方式正常写入,并且能按照期望的分词方式进行查询。那么核心的需求就已经实现了。
其他的操作,

更新索引
删除文档
更新文档
等等操作会在后续的学习中再进行补充。

发表评论

邮箱地址不会被公开。 必填项已用*标注