#Vespa を使ってしてみる
Vespa ってなに?
Yahoo!が利用しているビッグデータ処理エンジンでOSSとして公開されています。
Yahoo!が高速クエリ処理などを行うために開発した大規模データセット向け処理エンジンで、Yahoo.com、Yahoo Japanなどで実際に利用されている。文章検索やランキングの生成・レコメンデーションを作るのにも使えるらしい
インストールした環境
- MacOS X Sierra
- Docker for mac Version 17.09.0-ce-mac35 (19611)
インストール方法
Quick Start の通りにやってみた
github から サンプルアプリをclone
$ git clone https://github.com/vespa-engine/sample-apps.git
$ export VESPA_SAMPLE_APPS=`pwd`/sample-apps
Vespa の Dockerコンテナを起動する
$ docker run --detach --name vespa --hostname vespa-container --privileged \
--volume $VESPA_SAMPLE_APPS:/vespa-sample-apps --publish 8080:8080 vespaengine/vespa
コンテナが起動したらVespaが動作しているか確認します。
$ docker exec vespa bash -c 'curl -s --head http://localhost:19071/ApplicationStatus'
正しく動作していればこんなレスポンスが返ります。200 OKが返ってこなかったら暫くまって返ってくるまで待ちましょう。
HTTP/1.1 200 OK
Date: Fri, 20 Oct 2017 23:23:34 GMT
Content-Type: application/json
Content-Length: 8478
サンプルアプリをVespaにデプロイします
docker exec vespa bash -c '/opt/vespa/bin/vespa-deploy prepare /vespa-sample-apps/basic-search/src/main/application/ && \
/opt/vespa/bin/vespa-deploy activate'
サンプルアプリが動作しているか確認します。
$ curl -s --head http://localhost:8080/ApplicationStatus
正しく動作していればこんなレスポンスが返ります。200 OKが返ってこなかったら暫くまって返ってくるまで待ちましょう。
HTTP/1.1 200 OK
Date: Fri, 20 Oct 2017 23:36:08 GMT
Content-Type: application/json
Transfer-Encoding: chunked
使ってみる
サンプルデータを入れる
$ curl -s -X POST --data-binary @${VESPA_SAMPLE_APPS}/basic-search/music-data-1.json \
http://localhost:8080/document/v1/music/music/docid/1 | jq
$ curl -s -X POST --data-binary @${VESPA_SAMPLE_APPS}/basic-search/music-data-2.json \
http://localhost:8080/document/v1/music/music/docid/2 | jq
検索
$ curl -s http://localhost:8080/search/?query=bad | jq
結果
{
"root": {
"id": "toplevel",
"relevance": 1,
"fields": {
"totalCount": 2
},
"coverage": {
"coverage": 100,
"documents": 2,
"full": true,
"nodes": 0,
"results": 1,
"resultsFull": 1
},
"children": [
{
"id": "id:music:music::1",
"relevance": 0.254574922399675,
"source": "music",
"fields": {
"sddocname": "music",
"artist": "Michael Jackson",
"title": "Bad",
"duration": 247,
"year": 1987,
"documentid": "id:music:music::1"
}
},
{
"id": "id:music:music::2",
"relevance": 0.05447959677335429,
"source": "music",
"fields": {
"sddocname": "music",
"artist": "Eminem",
"title": "So Bad",
"year": 2010,
"documentid": "id:music:music::2"
}
}
]
}
}
$ curl -s http://localhost:8080/search/?query=Eminem | jq
{
"root": {
"id": "toplevel",
"relevance": 1,
"fields": {
"totalCount": 1
},
"coverage": {
"coverage": 100,
"documents": 2,
"full": true,
"nodes": 0,
"results": 1,
"resultsFull": 1
},
"children": [
{
"id": "id:music:music::2",
"relevance": 0.1272874611998375,
"source": "music",
"fields": {
"sddocname": "music",
"artist": "Eminem",
"title": "So Bad",
"year": 2010,
"documentid": "id:music:music::2"
}
}
]
}
}
ドキュメントの取り出し
$ curl -s http://localhost:8080/document/v1/music/music/docid/2
{
"fields": {
"artist": "Eminem",
"title": "So Bad",
"year": 2010,
"album": "Recovery"
},
"id": "id:music:music::2",
"pathId": "/document/v1/music/music/docid/2"
}
コンテナの終了と削除
試し終わったら、コンテナを終了して削除します。
$ docker stop vespa
$ docker rm vespa