MacにVespaをインストールして動作確認するまで

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

GitHub - vespa-engine/vespa: AI + Data, online. https://vespa.ai
AI + Data, online. Contribute to vespa-engine/vespa development by creating an account on GitHub.

Vespaのインストール

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

Quick Start, using Docker

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

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の以下のリポジトリで管理されています。

GitHub - vespa-engine/sample-apps: Repository of sample applications for https://vespa.ai, the open big data serving engine
Repository of sample applications for the open big data serving engine - GitHub - vespa-engine/sample-apps: Repository o...

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に以下のスキーマが反映されます。

sample-apps/album-recommendation/schemas/music.sd at master · vespa-engine/sample-apps
Repository of sample applications for the open big data serving engine - vespa-engine/sample-apps

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

サンプルデータをフィードします。成功すると以下のように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は正規化されているため、大文字/小文字を区別せず検索されます。)

参考:

Vespa Query Language - YQL
Linguistics in Vespa

コメント