最近検索周りの勉強を初めました。今回はOSSの検索エンジンであるVespaの環境をMac上に構築して動かしてみたいと思います。
Vespaのインストール
以下のQuick Startに従ってインストールを進めます。
必要なスペックを満たしているか確認
Dockerに割り当てられているメモリを確認します。Vespaを動かすには最低4GBのメモリが必要らしいです。
$ docker info | grep "Total Memory"
Total Memory: 3.842GiB
3.842GiB…。GB単位に直すとギリギリ4GB超えてるので大丈夫なはず。
vespa-cliのインストール
Vespaのコマンドラインツールをインストールします。Macではhomebrewで簡単にインストールできます。
$ brew install vespa-cli
Vespaの初期設定
今回はローカル上に環境を構築するためtargetをローカルに設定します。ヘルプを見た感じデフォルトでlocal
に設定されてそうでしたが、公式のQuick Startに書いてあったので一応実行しておきます。
$ vespa config set target local
Vespaの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 300
Waiting 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 myapp
myapp
というディレクトリに無事クローンされました。
$ ls myapp/
README.md ext schemas services.xml tests
サンプリアプリのデプロイ
クローンしてきたalbum-recommendation
をVespaにデプロイします。コマンドを実行して以下のような表示になれば成功です。
$ cd myapp
$ vespa deploy --wait 300
Uploading 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.json
Success: put id:mynamespace:music::a-head-full-of-dreams
Success: put id:mynamespace:music::love-id-here-to-stay
Success: 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
は正規化されているため、大文字/小文字を区別せず検索されます。)
参考:
コメント