Full Elasticsearch php (ok)

https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/search_operations.html

Xem tất cả type của index trong Elasticsearch (ok)

<?php  
    $params = [
      'index' => 'article'
    ];
    $results = $client->search($params);
    echo '<pre>';
      var_export($results);
    echo '</pre>';
  ?>

Xem tất cả 1 index (ok)

$response = $client->cat()->indices();
echo '<pre>';
  var_export($response);
echo '</pre>';

Xóa all indices

curl -XDELETE localhost:9200/indexname
$action = $_GET['action'] ?? '';
  $id = $_GET['id'] ?? '';
  if($action == 'delete') {
    $params = [
      'index' => 'article',
      'type' => 'article_type',
      'body' => [
        'query' => [
          "match_all" => (object)[]
        ]
      ]
    ];
    $response = $client->deleteByQuery($params);
    echo '<pre>';
      var_export($response);
    echo '</pre>';
  }

part 1: Tạo đối tượng Client

<?php
use Elasticsearch\ClientBuilder;
require 'vendor/autoload.php';
//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();

part 2: Tạo một Document trong Index

// Tạo một Document
$params = [
  'index' => 'article', // Index lưu Document
  'id'    => '1', //Nếu thiếu id thì ID tự sinh
  'type'  => 'article_type'
  'body'  => [
    'testkey' => 'testvalue'
  ], //Dữ liệu Document
];
$response = $client->index($params); 
echo '<pre>';
	var_export($response);
echo '</pre>';

part 3: Kiểm tra xem Index đã tồn tại không

// //Kiểm tra xem Index đã tồn tại không
$params   = [
  'index' => 'article',
];
$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!";
}

part 4: Cập nhật Document

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

part 5: Xóa một Document trong Index

$params = [
  'index' => 'article',
  'type' => 'article_type',
  'id' => '1'
];
$response = $client->delete($params);
echo '<pre>';
	var_export($response);
echo '</pre>';

part 6: 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);
echo '<pre>';
  var_export($responses);
echo '</pre>';

Part 7. 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' => 'value11'
          ],
        ],
        'should' => [
          [
            'match' => [
              'testkey1' => 'value1',
            ],
          ],
          [
            'match' => [
              'testkey2' => 'value2',
            ],
          ],
        ],
      ],
    ],
  ],
];
$results = $client->search($params);
echo '<pre>';
  var_export($results);
echo '</pre>';

Part 8. Kỹ thuật scroll để lấy hết kết quả tìm kiếm (chưa hoàn thành)

// Kỹ thuật scroll để lấy hết kết quả tìm kiếm (chưa hoàn thành)
// $params = [
//   'index'  => 'article',
//   'type'   => 'article_type',
//   'scroll' => '1m', // Giữ con trỏ tìm kiếm tồn tại 1m để truy vấn trang tiếp theo
//   'size'   => 10000, // mỗi trang 1000 kết quả
//   'body'   => [
//     'query' => [
//       'match' => [
//         'testkey' => 'testvalue',
//       ],
//     ],
//   ],
// ];
// $response = $client->search($params); // Truy vấn đầu tiên
// while (isset($response['hits']['hits']) && count($response['hits']['hits']) > 0) {
//   // **
//   // Viết code xử lý kết quả  trả về (đọc) - foreach ($rs['hits']['hits'] as $r)
//   // **
//   // Khi hoàn thành, lấy scroll_id để lấy kết quả trang tiếp (như 10000 kết quả tiếp theo)
//   $scroll_id = $response['_scroll_id'];
//   // Thực hiện cuộn tới kết quả tiếp theo
//   $response = $client->scroll([
//     'scroll_id' => $scroll_id,
//     'scroll'    => '30s', // thiết lập con trỏ tồn tại tiếp 30s
//   ]
//   );
// }

Part 9: Get all indices (ok)

<?php
use Elasticsearch\ClientBuilder;
require 'vendor/autoload.php';
$hosts = [
  [
    'host'   => 'localhost',
    'port'   => '9200',
    'scheme' => 'http'
  ],
];
$client = ClientBuilder::create()->setHosts($hosts)->build();
$response = $client->cat()->indices();
echo '<pre>';
  var_export($response);
echo '</pre>';
?>

Đây là một ví dụ hoàn chỉnh code (ok)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet">
  <title>Document</title>
</head>
<body>
  <nav class="navbar navbar-expand-lg navbar-light bg-light">
    <a class="navbar-brand" href="#">Logo</a>
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav mr-auto">
        <li class="nav-item">
          <a class="nav-link" href="/?action=create">Create</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="/?action=delete">Delete</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="/?action=update">Update</a>
        </li> 
        <li class="nav-item">
          <a class="nav-link" href="/?action=search">Search</a>
        </li>
      </ul>
    </div>
  </nav>
  <?php
    use Elasticsearch\ClientBuilder;
    require 'vendor/autoload.php';
    $hosts = [
      [
        'host'   => 'localhost',
        'port'   => '9200',
        'scheme' => 'http'
      ],
    ];
    $client = ClientBuilder::create()->setHosts($hosts)->build();
  ?>
  <?php  
    // $response = $client->cat()->indices();
    // echo '<pre>';
    //   var_export($response);
    // echo '</pre>';
  ?>
  <?php  
    // $params = [
    //   'index' => 'article'
    // ];
    // $results = $client->search($params);
    // echo '<pre>';
    //   var_export($results);
    // echo '</pre>';
  ?>
  <?php  
    // Xem một index
    // $params = [
    //   'index' => 'article',
    //   'type'  => 'article_type',
    //   'id'  => '1'
    // ];
    // $results = $client->get($params);
    // echo '<pre>';
    //   var_export($results);
    // echo '</pre>';
  ?>
  <?php  
    $action = $_GET['action'] ?? '';
    $id = $_GET['id'] ?? '';
    if($action == 'delete') {
      // Delete allindex
      // $params = [
      //   'index' => 'article',
      //   'type' => 'article_type',
      //   'body' => [
      //     'query' => [
      //       "match_all" => (object)[]
      //     ]
      //   ]
      // ];
      // $response = $client->deleteByQuery($params);
      // echo '<pre>';
      //   var_export($response);
      // echo '</pre>';
      // Delete a index
      // $params = [
      //   'index' => 'article',
      //   'type' => 'article_type',
      //   'id'   => '1'
      // ];
      // $response = $client->deleteByQuery($params);
      // echo '<pre>';
      //   var_export($response);
      // echo '</pre>';
    }
    else if($action == 'update') {
      // $params = [
      //   'index' => 'article',
      //   'type' => 'article_type',
      //   'id' => '1',
      //   'body' => [
      //     'doc' => [
      //       'testkey1' => 'testkey1'
      //     ]
      //   ]
      // ];
      // $response = $client->update($params);
      // echo '<pre>';
      //   var_export($response);
      // echo '</pre>';
    }else if($action == 'create') {
      // $params   = [
      // 'index' => 'article',
      // 'type'  => 'article_type',
      // 'id'    => '1', 
      // 'body'  => [
      //   'testkey' => 'testvalue'
      //   ]
      // ];
      // $response = $client->index($params); 
      // echo '<pre>';
      //   var_export($response);
      // echo '</pre>';
    }
    else if($action == 'search') {
      $params   = [
      'index' => 'article',
      'type'  => 'article_type',
      'body'  => [
        'query' => [
            'bool' => [
              'should' => [
                ['match' => ['testkey' => 'testvalue']],
                ['match' => ['testkey' => 'test']]
              ]
            ]
          ]
        ]
      ];
      $response = $client->search($params); 
      echo '<pre>';
        var_export($response);
      echo '</pre>';
    }
  ?>
</body>
</html>

Đọc thêm phần 5, phần 6

Last updated