Lập trình PHP

Phần này trình bày cách sử dụng elasticsearch-php là thư viện để PHP kết nối làm việc với Elasticsearch.

Cài đặt elasticsearch-php

Nên sử dụng Composer để cài đặt elasticsearch-php, gõ lệnh sau:
composer require  "elasticsearch/elasticsearch"
Sau khi thư viện đã tích hợp vào dự án, các file PHP độc lập muốn nạp thư viện này sử cần thêm vào đoạn mã
require 'vendor/autoload.php';
Như vậy đã sẵn sàng để dùng elasticsearch-php, cũng chú ý là PHP cần có extension ext-curl (xem thêm sử dụng curl với php)

Cấu hình kết nối PHP tới Elasticsearch

Đối tượng dùng để kết nối tương tác với ES sinh ra từ lớp Elasticsearch/Client, có có được nó có thể dùng công cụ ClientBuilder với dữ liệu cầu hình kết nối. Ví dụ:

//Cấu hình kết nối đến ES
$hosts = [
    [
        'host' => 'localhost',          //yourdomain.com
        'port' => '9200',
        'scheme' => 'http',             //https
//        'path' => '/elastic',
//        'user' => 'username',         //nếu ES cần user/pass
//        'pass' => 'password!#$?*abc'
    ],

];
//Tạo đối tượng Client
$client = ClientBuilder::create()
    ->setHosts($hosts)
    ->build();

Sau khi có $client thì bắt đầu có thể sử dụng nó để thực hiện các thao tác trên ES như: search, update, delete ..., sau đây là một số thao tác sau khi có $client

Tạo / xóa một Index

Ví dụ cần tạo một ES index đặt tên là article

$params = [
    'index' => 'article'
];


//Kiểm tra xem Index đã tồn tại không
$indexExist = $client->indices()->exists($params);

if (!$indexExist) {
    try {
        //Thực hiện tạo Index
        $response = $client->indices()->create($params);


    }
    catch (Exception $e) {
        //Lỗi tạo Index
        $res = json_decode($e->getMessage());
        echo $res->error->reason;
    }
}
else {
    echo "Index {$params['index']} đã có rồi!";
}

Nếu muốn xóa một Index thì thực hiện như sau:

$params = [
    'index' => 'article'
];


//Kiểm tra xem Index đã tồn tại không
$indexExist = $client->indices()->exists($params);

if ($indexExist) {
    $response = $client->indices()->delete($params);
    echo "Đã xóa";
}
else {
    echo "Index {$params['index']} không có";
}

Chỉ mục, cập nhật, xóa Document

Chỉ mục (tạo, cập nhật) một Document
$params = [
    'index' => 'article',                       //Index lưu Document
    'id' => '1',                                //Nếu thiếu id thì ID tự sinh
    'type' => 'article_type',
    //'timestamp' => time(),                    // Thiết lập timestamp nếu cần thiết
    'body' => [ 'testkey' => 'testvalue']       //Dữ liệu Document
];

$response = $client->index($params); 
Lập chỉ mục nhiều Document
$params = [
  'body' => [
      [ 'index' => ['_index' => 'article',  '_type' => 'article_type', ] ],
      [ 'testkey1' => 'value1', 'testkey2' => 'testkey2'],

      [ 'index' => ['_index' => 'article',  '_type' => 'article_type', ] ],
      [ 'testkey1' => 'value11', 'testkey2' => 'testkey22']

    ]
];

$responses = $client->bulk($params);
Đọc một Document từ Index
$params = [
    'index' => 'article',
    'type' => 'article_type',
    'id' => '1'
];

$response = $client->get($params);
Cập nhật Document
$params = [
    'index' => 'article',
    'type' => 'article_type',
    'id' => '1',
    'body' => [
        'doc' => [
            'testkey1' => 'valueabc',
            'new_field' => 'abc'
        ]
    ]
];

$response = $client->update($params);
Xóa một Document trong Index
$params = [
'index' => 'article',
'type' => 'article_type',
'id' => '1'
];

$response = $client->delete($params);

Tìm kiếm với ES

Tìm kiếm với match query
$params = [
    'index' => 'article',
    'type' => 'article_type',
    'body' => [
        'query' => [
            'match' => [
                'testkey' => 'testvalue'
            ]
        ]
    ]
];

$results = $client->search($params);
Tìm kiếm phức tạp hơn với logic should, must ...
$params = [
    'index' => 'article',
    'type' => 'article_type',
    'body' => [
        'query' => [
            'bool' => [
                'filter' => [
                    'term' => [ 'testkey1' => 'abc' ]
                ],
                'should' => [
                    ['match' => [ 'testkey1' => 'value1' ]],
                    ['match' => [ 'testkey2' => 'value2' ]]
                ]
            ]
        ]
    ]
];


$results = $client->search($params);

Mã nguồn tham khảo: elasticsearch-learning

Đăng ký theo dõi ủng hộ kênh