Elasticsearchメモ①

2022年6月21日

環境

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