こんにちは、虎の穴ラボの古賀です。
みなさま、全文検索エンジンを使っていますか?
クラウドだと「Amazon Elasticsearch Service」や「Azure Cognitive Search」など、さまざまな選択肢があると思います。
今回は、虎の穴ラボの社内のWebツールに導入できそうな、簡易的な全文検索エンジンにどのようなものがあるか調べた際に見つけた、「Bayard」という全文検索エンジンを試してみました。
「Bayard」は、Rust製の高速かつ軽量で日本語の全文検索ができる検索エンジンです。導入手順が比較的簡単で、Webツールの検索機能の改善に使えそうです。
Bayardとは?
Bayardは、Raft Consensus Algorithm と gRPC を実装する、 Rustで記述された全文検索およびインデックス作成のサーバーです。
Tantivy(Rust製 全文検索ライブラリ)をベースに開発されていて Bayardを使用すると、高可用性を備えた全文検索アプリケーションを簡単に開発できます。
Bayardの特徴
GitHubからの引用ですが、下記のようなことができます。
- 全文検索/索引付け(日本語に対応)ができる
- REST APIが利用できる(バックエンドを開発しなくても良い)
- コマンドライン・インターフェイスが利用できる
- インデックスの複製ができる
- クラスターを立ち上げる
日本語の全文検索には
「Lindera(Rust製日本語形態素解析)」
が使われています
動作確認環境
- CentOS 7 または macOS Big Sur
- Docker + Docker Compose または Docker Desktop
今回、試すこと
- 全文検索/索引付け(日本語に対応)する
- REST APIを利用する
- コマンドライン・インターフェイスを利用する
今回、試さないこと
- インデックスの複製をする
- クラスターを立ち上げる
BayardとBayard RESTを試してみる
BayardにはREST APIが用意されており、バックエンドの開発をしなくても検索や検索データの登録をすることができます。
REST APIはDockerイメージが提供されているため、今回はDockerで手軽に試してみます。
1. GitHubからソースコードをクローンする
BayardのGitHubのリポジトリをクローンして、クローンしたディレクトリに移動します。
[コンソールで入力]
$ git clone https://github.com/bayard-search/bayard.git
$ cd bayard
2. docker-compose.ymlのスキーマファイルの指定を英語から日本語に変える
スキーマファイルとは?
RDBのテーブルのカラム情報のようなもので、インデックスにどのようなデータを格納するか定義します
Bayardはデフォルトで英語のスキーマのサンプルを読み込んで起動するので、日本語のスキーマのサンプルに変えます
[docker-compose.yml]
version: '3' services: bayard: container_name: bayard image: bayardsearch/bayard:latest entrypoint: bayard volumes: - ./examples/schema_ja.json:/etc/bayard/schema_ja.json # 日本語のサンプルスキーマをマウント command: - '--host=bayard' - '--raft-port=7000' - '--index-port=5000' - '--metrics-port=9000' - '--data-directory=/tmp/bayard' - '--tokenizer-file=/etc/bayard/tokenizer.json' - '--schema-file=/etc/bayard/schema_ja.json' # マウントしたスキーマを指定 - '1' ports: - "5000:5000" - "7000:7000" - "9000:9000" bayard-rest: container_name: bayard-rest image: bayardsearch/bayard-rest:latest entrypoint: bayard-rest ports: - "8000:8000" command: - '--host=0.0.0.0' - '--port=8000' - '--index-address=bayard:5000' depends_on: - bayard
3. Bayard RESTを起動します
[コンソールで入力]
$ docker-compose up -d
4. 日本語のサンプルデータを登録します
日本語のスキーマのサンプルに合わせたテストデータが用意されているため、そのデータを登録します。
登録した後には、必ず、commitが必要です。
[コンソールで入力]
$ curl -X PUT \ --header 'Content-Type: application/json' \ --data-binary @./examples/doc_ja.json \ 'http://localhost:8000/v1/documents/1' $ curl -X GET 'http://localhost:8000/v1/commit'
5. 日本語のデータを日本語で全文検索します
[コンソールで入力]
$ curl -X POST 'http://localhost:8000/v1/search' --data-binary 'description:検索' # 「検索」で全文検索する {"_id":["1"],"description":["検索エンジン(けんさくエンジン、英: search engine)は、狭義にはインターネットに存在する情報(ウェブページ、ウェブサイト、画像ファイル、ネットニュースなど)を検索する機能およびそのプログラム。インターネットの普及初期には、検索としての機能のみを提供していたウェブサイトそのものを検索エンジンと呼んだが、現在では様々なサービスが加わったポータルサイト化が進んだため、検索をサービスの一つとして提供するウェブサイトを単に検索サイトと呼ぶことはなくなっている。広義には、インターネットに限定せず情報を検索する
Bayard CLIを試してみる
Bayardにはコマンドライン・インターフェイスも用意されています。
REST APIを起動せずにデータ登録や全文検索ができて、公開前にデータだけ作っておくとか、REST APIが不要な際に便利なので試してみます。
1. Bayard CLIのDockerイメージをpullする
[コンソールで入力]
$ docker pull bayardsearch/bayard-cli:latest
2. Bayard CLIを起動する
[コンソールで入力]
$ docker run --net=bayard_default --rm --name bayard-cli \ bayardsearch/bayard-cli:latest \ schema \ --server=bayard:5000
3. 日本語のサンプルデータを登録します
REST APIの時と同じく、登録した後は、必ず、commitが必要です。
[コンソールで入力]
$ cat ./examples/doc_ja.json | xargs -0 docker run --net=bayard_default --rm --name bayard-cli \ bayardsearch/bayard-cli:latest \ set 1 \ --server=bayard:5000 $ docker run --net=bayard_default --rm --name bayard-cli \ bayardsearch/bayard-cli:latest \ commit \ --server=bayard:5000
4. 日本語のデータを日本語で全文検索します
[コンソールで入力]
# 「検索」で全文検索する $ docker run --net=bayard_default --rm --name bayard-cli \ bayardsearch/bayard-cli:latest \ search description:検索 \ --server=bayard:5000 {"count":1,"docs":[{"fields":{"_id":["1"],"description":["検索エンジン(けんさくエンジン、英: search engine)は、狭義にはインターネットに存在する情報(ウェブページ、ウェブサイト、画像ファイル、ネットニュースなど)を検索する機能およびそのプログラム。インターネットの普及初期には、検索としての機能のみを提供していたウェブサイトそのものを検索エンジンと呼んだが、現在では様々なサービスが加わったポータルサイト化が進んだため、検索をサービスの一つとして提供するウェブサイトを単に検索サイトと呼ぶことはなくなっている。広義には、インター
Bayardの使い方
実際のアプリケーションで使う際には、検索画面などのフロントエンドの開発に加えて、
初期データを登録するバッチプログラムや、全文検索データを更新したい時に差分を登録する機能の開発などが必要になります。
REST APIが用意されているため、バックエンドの開発がなくても良いのは、お手軽に日本語の全文検索エンジンを試せるので、良いと思います!
まとめ
JSONファイルと親和性が高いので、他にもログファイルや大量のJSONファイルの全文検索とかにも使えそうだなと感じました。
今後も良さそうな全文検索エンジンがあったら、他にも試してみたい!と考えています。
P.S.
3/19(金)19:30~ 【オンライン】3/19 とらのあなエンジニア&マーケター採用説明会【地方勤務可能!!】 yumenosora.connpass.com
採用情報
募集職種
yumenosora.co.jp
カジュアル面談も随時開催中です
お申し込みはこちら!
yumenosora.connpass.com
ToraLab.fmスタートしました!
メンバーによるPodcastを配信中!是非スキマ時間に聞いて頂けると嬉しいです。
anchor.fm
Twitterもフォローしてくださいね!
ツイッターでも随時情報発信をしています
twitter.com