検索すると v2 の記事ばかり出てきたので、v3 のを備忘録がてら書いてみました。
PHP のコードだけです。PHP は 5.6.x で書いてます。
CloudSearch の準備は他の記事を参考にしてください。
参考:Amazon CloudSearch: 簡単な地理空間検索をやってみる - Qiita
準備
まずは AWS SDK を Composer とかでインストールして、
ドメインクライアントを呼びます。
use Aws\CloudSearchDomain\CloudSearchDomainClient;
データのアップロード
$domainClient = CloudSearchDomainClient::factory([
'endpoint' => 'http://document-xxxx.resion.cloudsearch.amazonaws.com', // Document Endpoint
'version' => '2013-01-01',
// credentials はコードに書かずに、環境変数等で設定するのがいいです
// 'credentials' => [
// 'key' => '****',
// 'secret' => '****',
// ],
]);
$domainClient->uploadDocuments([
'contentType' => 'application/json',
'documents' => json_encode([[
'type' => 'add',
'id' => 1,
'fields' => [
'age' => 30, // int
'name' => '山田太郎', // text
'check' => [ 1, 2, 3, 4 ], // int-array
'created' => '2017-05-01T00:00:00Z', // date
],
]]),
]);
新規追加も更新もこれでできます。
フィールドの型が合っていないとエラーが出ます。
date 型の場合、RFC3339 形式で UTC で指定しないといけないので、私は下記のようにしました。
gmdate('Y-m-d\TH:i:s\Z', time())
PHPの DateTime クラス の DATE_RFC3339
とかでいけるかと思ったんですが、末尾 Z
ではなく +00:00
になるのはエラーが出てしまいました。
チェックボックスで入力するような値は、DB ならビットで 1 カラムに入れたりしますが、検索でビット演算子が使えなそうだし、 int-array があるのでそれにしました。
検索
$domainClient = CloudSearchDomainClient::factory([
'endpoint' => 'http://search-xxxx.resion.cloudsearch.amazonaws.com', // Search Endpoint
'version' => '2013-01-01',
]);
$result = $domainClient->search([
'query' => "name: 'やまだ' created: [2017-04-30T15:00:00Z TO *]",
'queryParser' => 'lucene',
]);
var_dump($result);
queryParser
は Lucene にしましたが、お好みでいいと思います。
Lucene だと '*:*'
とすると全件出せるので、他のは出し方わからなかったので、これにしました。
syntax もググるとすぐ出てきますし(Lucene Query Syntax)。