Vespa(ベスパ)について、紹介していこうと思います。
Vespaは高機能な検索エンジンです。ベクトル検索(ANN)、語彙検索、構造化データの検索が一つのクエリで可能です。さらに、統合された機械学習の推論を利用することで、データをリアルタイムで分析し、AIでの解析もできます。大規模なデータも扱えるので、様々なプロジェクトで利用できると思います。
Vespa自体は、歴史がある検索エンジンで、2017年にApacheライセンスでオープンソースとして、公開されています。過去には、Yahooのサービスなどでも利用されていたりもしたので、実績もあると思います。最近では、Vespa自体がスピンアウトして、会社になったようなので、普及に向けて、やる気を出してきた感じがあります。その会社では、クラウドサービスであるVespa Cloudを提供していく感じだと思います。
とはいえ、現状、普及している感じがない気がしてます…。ちょっと理由を考えていくと、
そもそもVespaという単語をググると、ほぼバイクしか、ヒットしないので、ググって情報を探すというのも困難です。あとは、公式サイトのドキュメントは充実している感じはあるのですが、欲しい情報を得るまでにいろいろと見ないとよくわからない、という学習コストの高さがあるようにも思います(個人的な見解ですが…)。
他にもrank-profile的なスキーマを書かないといけないところも難易度を上げている気もします。Elasticsearchでいうなら、マッピングを定義した後に、独自のSimilarityも定義しないといけないみたいな…。
それら以外にも、Yahooが提供している日本語の情報もあったりするのですが、古いので、手順通りにはできないので、雰囲気を掴むくらいにしか使えなかったりと…。欲しい情報にたどり着くのに苦労する感が…。
という感じの壁を乗り越えないと、使えない感じだと思います。ですが、他にはない興味深い機能があったりと、製品としては魅了があるものだと思います。
とりあえず、この敷居を下げるために(&自分自身の学習のために)、いろいろと情報を提供していければと思います。
まずは、簡単に使ってみましょう。Vespaを試すためには、
- Docker (4GB以上のメモリーが利用可能であること)
- vespaコマンド
があれば、試すことができます。詳しくはQuick Startとかを参照してください。
まず、vespaコマンドをインストールします。Macであれば、brewコマンドでインストールできます。
$ brew install vespa-cli
Linuxとかであれば、リリースサイトからVespa CLIをダンロードして、vespaコマンドにパスを通せばよいです。
では、早速、Dockerで起動しましょう。
$ docker run --detach --name vespa --hostname vespa-container \
--publish 8080:8080 --publish 19071:19071 \
vespaengine/vespa
8080ポートが検索やインデクシングするときに利用するもので、19071ポートはConfigサーバーのエンドポイントになります。
Vespaを利用するにはアプリをデプロイする必要があります。今回は、vespaコマンドでサンプルアプリを作成&デプロイします。
以下のコマンドを実行して、myappディレクトリにアプリが作られます。
$ vespa clone album-recommendation myapp && cd myapp
いくつかファイルが作成されますが、schemas/music.sdがスキーマ定義で、services.xmlがサービスの設定になります。この2つがわかれば、何とかなります。
今回は、さくっと試すだけなので、それらの中身の話は置いておいて、デプロイしてしまいましょう。
$ vespa deploy --wait 300
とすると、デプロイされます。
デプロイされたら、ext/documents.jsonlにあるドキュメントをフィードしましょう(データをインデクシングしましょう)。
$ vespa feed ext/documents.jsonl { "feeder.seconds": 0.230, "feeder.ok.count": 5, "feeder.ok.rate": 5.000, "feeder.error.count": 0, "feeder.inflight.count": 0, "http.request.count": 5, "http.request.bytes": 724, "http.request.MBps": 0.001, "http.exception.count": 0, "http.response.count": 5, "http.response.bytes": 658, "http.response.MBps": 0.001, "http.response.error.count": 0, "http.response.latency.millis.min": 227, "http.response.latency.millis.avg": 227, "http.response.latency.millis.max": 227, "http.response.code.counts": { "200": 5 } }
フィードすると、情報が出力されます。”feeder.ok.count”が5なので、5件登録しました。
検索はYQLを利用して、たとえば、以下の感じで検索できます。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": 5, "full": true, "nodes": 1, "results": 1, "resultsFull": 1 }, "children": [ { "id": "id:mynamespace:music::a-head-full-of-dreams", "relevance": 0.16343879032006287, "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 } } } } ] } }
あとは、ID指定で取得もできます。
$ vespa document get id:mynamespace:music::a-head-full-of-dreams { "pathId": "/document/v1/mynamespace/music/docid/a-head-full-of-dreams", "id": "id:mynamespace:music::a-head-full-of-dreams", "fields": { "artist": "Coldplay", "year": 2015, "category_scores": { "type": "tensor<float>(cat{})", "cells": { "pop": 1.0, "rock": 0.20000000298023224, "jazz": 0.0 } }, "album": "A Head Full of Dreams" } }
今回は、この辺にして、Dockerでstopすれば終了します。
$ docker stop vespa
以上の感じで、DockerとVespa CLIがあれば簡単に試すことができます。
今後もこんな感じで、いろいろと紹介できれば良いなと思います。