環境
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 構文に基づいているらしいので、末尾のカンマは使用不可