853 文字
4 分
MacにVespaをインストールして動作確認するまで
2023-01-05
2026-07-08

最近検索周りの勉強を初めました。今回はOSSの検索エンジンであるVespaの環境をMac上に構築して動かしてみたいと思います。

Vespaのインストール#

以下のQuick Startに従ってインストールを進めます。

必要なスペックを満たしているか確認#

Dockerに割り当てられているメモリを確認します。Vespaを動かすには最低4GBのメモリが必要らしいです。

Terminal window
$ docker info | grep "Total Memory"
Total Memory: 3.842GiB

3.842GiB…。GB単位に直すとギリギリ4GB超えてるので大丈夫なはず。

vespa-cliのインストール#

Vespaのコマンドラインツールをインストールします。Macではhomebrewで簡単にインストールできます。

Terminal window
$ brew install vespa-cli

Vespaの初期設定#

今回はローカル上に環境を構築するためtargetをローカルに設定します。ヘルプを見た感じデフォルトでlocalに設定されてそうでしたが、公式のQuick Startに書いてあったので一応実行しておきます。

Terminal window
$ vespa config set target local

VespaのDockerコンテナを起動#

VespaのDockerコンテナを起動させます。

Terminal window
$ docker run --detach --name vespa --hostname vespa-container \
--publish 8080:8080 --publish 19071:19071 \
vespaengine/vespa

これでVespaを使う下準備ができました。Vespaが正常に起動できているか確認します。以下のように表示されたらOKです。

Terminal window
$ 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コマンドを使えば上記リポジトリの特定のサンプルアプリをローカルにクローンすることができます。

Terminal window
$ vespa clone <サンプルアプリのパス> <ローカルのクローン先のパス>

今回はQuick Startに従ってalbum-recommendationというサンプルアプリをクローンします。

Terminal window
$ vespa clone album-recommendation myapp

myappというディレクトリに無事クローンされました。

Terminal window
$ ls myapp/
README.md ext schemas services.xml tests

サンプリアプリのデプロイ#

クローンしてきたalbum-recommendationをVespaにデプロイします。コマンドを実行して以下のような表示になれば成功です。

Terminal window
$ cd myapp
$ vespa deploy --wait 300
Uploading application package ... done
Success: Deployed .
Waiting up to 5m0s for query service to become available ...

デプロイが成功すると、Vespaに以下のスキーマが反映されます。

サンプルデータのフィード#

サンプルデータをフィードします。成功すると以下のようにSuccessと表示されます。

Terminal window
$ 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という文言が含まれているデータを検索してみます。

Terminal window
$ 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は正規化されているため、大文字/小文字を区別せず検索されます。)

参考: