Open6

全文検索を少しずつ食べていく

つきみつきみ

プロジェクトで全文検索をやることになり、その時に引っかかった点を挙げていく
TypeScript が前提

つきみつきみ

Algolia

全文検索のサーバーレスの王と言ったら Algolia(言い過ぎ)
実際のところ、OSSのドキュメントを中心に見かけることが非常に多い

Elasticsearch

全文検索の王、Elastic
Elastic Serverless というものが出たようだが、スタート初期には Algolia よりも料金の負担が大きそう
システムが大規模化して、軌道に乗り始めたら採用し始めるのはありかも?

Meilisearch

正式リリース前に試しで遊んだとき、検索スピードの速さに驚愕した覚えがある
SDKも使いやすかったので、Algolia のようなオペレーション毎の課金システムができたら喜んで使いたい

つきみつきみ

Meilisearch

Algolia がよく分からない挙動をするので Meilisearch へ。
興味あったからね、えぇ、逃げたわけではないから。うん。

つきみつきみ

Meilisearch を動かす

docker-compose.yaml
version: '3.8'

services:
  meilisearch:
    image: getmeili/meilisearch:v1.15
    container_name: meilisearch
    ports:
      - "7700:7700"
    environment:
      - MEILI_MASTER_KEY=INPUT_HERE
      - MEILI_HTTP_ADDR=0.0.0.0:7700
      - MEILI_ENV=development
      - MEILI_DB_PATH=/meili_data
    volumes:
      - meilisearch_data:/meili_data
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:7700/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

volumes:
  meilisearch_data:
    driver: local

AIに適当に書かせて、こんな感じのを動かす。
動くことを確認する。

つきみつきみ

検索対象のオブジェクトをまとめた SearchCollection という型を作り、

  async search(query: string, options: SearchParams): Promise<SearchResponse<SearchCollection>> {
    const result = await this.getIndex().search<SearchCollection>(query, options)
    return result
  }

で、検索できるようにする。