全文検索
リコメンデーション
Vespa

Vespaをインストールしてみる

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