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があれば簡単に試すことができます。
今後もこんな感じで、いろいろと紹介できれば良いなと思います。