環境
Next.jsからDockerで動かしているElasticsearchに繋いでアレコレする
ホスト側のインストールや設定はよしなに…
【参考】DockerのElasticsearchの設定を書き換える
インストール
クライアント用のnodeライブラリをインストール
npm install elasticsearch
接続
const elasticsearch = require('elasticsearch');
const client = new elasticsearch.Client({
host: 'localhost:9200/',
log: 'trace'
});
検索
sizeを指定しないと、デフォルトでは10件しか返ってこない!
const search = await client.search({
index: 'hogehoge',
body: {
size : 100,
query: {
"match_all": {}
}
}
})
なお、bodyの中を以下のように、_sourceを指定してSQLのSELECTみたいに、特定のカラムだけ取得したり、matchで検索する。
body: {
size : max_size,
_source: ["mode","find"],
query: {
"match": {
"message": "hogehoge"
}
}
}
単にidで検索するのは以下(なお、getを使うと該当するidがないと404のエラーになる)
*values: [data_id1, data_id2]
もOK
body: {
query: {
ids: {
values: data_id
}
}
}
また、検索結果は以下のようにややこしい形式だが、response.hits.hits[i]._source
内にあるので、どうにかして取り出す
-> POST http://hogehoge:9200/memo/_search
{
"size": 100,
"_source": [
"mode",
"find"
],
"query": {
"match_all": {}
}
}
<- 200
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 9,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "memo",
"_type": "_doc",
"_id": "JmvAo4EBPjJae6aOVl2k",
"_score": 1,
"_source": {}
},
{
"_index": "memo",
"_type": "_doc",
"_id": "JWvAo4EBPjJae6aOK13x",
"_score": 1,
"_source": {}
},
{
"_index": "memo",
"_type": "_doc",
"_id": "-WtjoIEBPjJae6aOh1zz",
"_score": 1,
"_source": {
"mode": "find",
"find": "2回目"
}
}
]
}
}
登録
const add = await client.index({
index: 'hogehoge',
body: {
a:"aaa"
}
})
更新
doc:{ }
で包む"a":"DDD"
のようにキーにも" "
をつける
const update = await client.update({
index: 'kouju',
id: "DRYRgIEBGMbDfcRL9Qw9",
body: {
doc:{
"a":"DDD"
}
}
})
削除
const del = await client.delete({
index: 'hogehoge',
id: "6"
})
React(Next.js)の非同期処理
【参考】React(Next.js) + Elasticsearch の非同期処理
その他
データ登録時、POSTだと追加、PUTだと追加もしくは既存のデータがあれば更新
クエリに?pretty
をつけるとレスポンスのJSONが整形されて出力(見やすくなる)
JSONの最後に余計な ,
があると怒られる
{
"data1":"AAA",
"data2":"BBB",
}
は許されない。最後の ,
は消しておく。
【参考】
オブジェクトリテラルの末尾のカンマは、ECMAScript 5 から
JSON は ES5 以前の JavaScript 構文に基づいているらしいので、末尾のカンマは使用不可