最近検索周りの勉強を初めました。今回はOSSの検索エンジンであるVespaの環境をMac上に構築して動かしてみたいと思います。
Vespaのインストール
以下のQuick Startに従ってインストールを進めます。
必要なスペックを満たしているか確認
Dockerに割り当てられているメモリを確認します。Vespaを動かすには最低4GBのメモリが必要らしいです。
$ docker info | grep "Total Memory" Total Memory: 3.842GiB3.842GiB…。GB単位に直すとギリギリ4GB超えてるので大丈夫なはず。
vespa-cliのインストール
Vespaのコマンドラインツールをインストールします。Macではhomebrewで簡単にインストールできます。
$ brew install vespa-cliVespaの初期設定
今回はローカル上に環境を構築するためtargetをローカルに設定します。ヘルプを見た感じデフォルトでlocalに設定されてそうでしたが、公式のQuick Startに書いてあったので一応実行しておきます。
$ vespa config set target localVespaのDockerコンテナを起動
VespaのDockerコンテナを起動させます。
$ docker run --detach --name vespa --hostname vespa-container \ --publish 8080:8080 --publish 19071:19071 \ vespaengine/vespaこれでVespaを使う下準備ができました。Vespaが正常に起動できているか確認します。以下のように表示されたらOKです。
$ vespa status deploy --wait 300Waiting up to 5m0s for deploy service to become available ...Deploy API at http://127.0.0.1:19071 is readyサンプルアプリケーションを動かしてみる
Vespaのサンプルアプリケーションを動かしてみます。
サンプルアプリのクローン
サンプルアプリケーションはGitHubの以下のリポジトリで管理されています。
vespa cloneコマンドを使えば上記リポジトリの特定のサンプルアプリをローカルにクローンすることができます。
$ vespa clone <サンプルアプリのパス> <ローカルのクローン先のパス>今回はQuick Startに従ってalbum-recommendationというサンプルアプリをクローンします。
$ vespa clone album-recommendation myappmyappというディレクトリに無事クローンされました。
$ ls myapp/README.md ext schemas services.xml testsサンプリアプリのデプロイ
クローンしてきたalbum-recommendationをVespaにデプロイします。コマンドを実行して以下のような表示になれば成功です。
$ cd myapp$ vespa deploy --wait 300Uploading application package ... done
Success: Deployed .
Waiting up to 5m0s for query service to become available ...デプロイが成功すると、Vespaに以下のスキーマが反映されます。
サンプルデータのフィード
サンプルデータをフィードします。成功すると以下のようにSuccessと表示されます。
$ vespa document ext/A-Head-Full-of-Dreams.json && \ vespa document ext/Love-Is-Here-To-Stay.json && \ vespa document ext/Hardwired...To-Self-Destruct.jsonSuccess: put id:mynamespace:music::a-head-full-of-dreamsSuccess: put id:mynamespace:music::love-id-here-to-staySuccess: put id:mynamespace:music::hardwired-to-self-destructこれでVespaに実際にデータを入れるところまで完了しました。
検索してみる
いよいよ検索してみます。
今回は、musicというスキーマのalbumというフィールドに、headという文言が含まれているデータを検索してみます。
$ vespa query "select * from music where album contains 'head'" language=en-US{ "root": { "id": "toplevel", "relevance": 1.0, "fields": { "totalCount": 1 }, "coverage": { "coverage": 100, "documents": 3, "full": true, "nodes": 1, "results": 1, "resultsFull": 1 }, "children": [ { "id": "id:mynamespace:music::a-head-full-of-dreams", "relevance": 0.16343879032006284, "source": "music", "fields": { "sddocname": "music", "documentid": "id:mynamespace:music::a-head-full-of-dreams", "artist": "Coldplay", "album": "A Head Full of Dreams", "year": 2015, "category_scores": { "type": "tensor<float>(cat{})", "cells": { "pop": 1.0, "rock": 0.20000000298023224, "jazz": 0.0 } } } } ] }}はい、無事検索結果が取得できました。
(albumは正規化されているため、大文字/小文字を区別せず検索されます。)
参考: