🦷

Elasticsearch をバックエンドにしてラップした検索 API を Express で簡単に作った

2022/12/29に公開

Elasticsearch の画面をそのままエンドユーザーに渡すわけにも行かないので簡単な検索用 Web ページを提供していました。そのときの検索用バックエンド API を Express で組み立てていました。

index.js
const express = require('express')
const { hostname } = require('os')
const app = express()

/// Express サーバーを 8888 番ポートで開始する
app.listen(8888, () => { console.log('Start Express...') })

/// ロードバランサーのヘルスチェック応答用
app.get('/healthcheck', (req, res) => {
  res.send("OK " + hostname() + "\n")
})

/// 検索用API
app.get('/search', (req, res) => {
  console.log(req.path + " : " + JSON.stringify(req.query))

  query = "*"
  if (req.query.q) {
    query = req.query.q
  }
  /// 実際は渡された文字列をそのまま使うと危殆化することが多いのでパース直して Elasticsearch に渡すのが良い

  es.search({
    "index": "index-*",
    "from": 0,
    "size": 10,
    "query": {
      "query_string": {
        "query": query,
        "default_field": "content",
        "default_operator": "and"
      }
    },
    "timeout": "3s"
  }).then((hits) => {
    res.json(hits)
  }).catch((err) => {
    res.status(500).json(err)
  })
})

/// 静的ファイルを /public ディレクトリから配信する設定を追加
app.use('/', express.static(__dirname + '/public'))

Discussion