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](http://docs.vespa.ai/documentation/vespa-quick-start.html) の通りにやってみた

### github から サンプルアプリをclone

```sh
$ git clone https://github.com/vespa-engine/sample-apps.git
$ export VESPA_SAMPLE_APPS=`pwd`/sample-apps
```

### Vespa の　Dockerコンテナを起動する

```shell-session
$ docker run --detach --name vespa --hostname vespa-container --privileged \
  --volume $VESPA_SAMPLE_APPS:/vespa-sample-apps --publish 8080:8080 vespaengine/vespa
```

### コンテナが起動したらVespaが動作しているか確認します。

```sh
$ 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にデプロイします

```sh 
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'
```

### サンプルアプリが動作しているか確認します。

```sh
$ 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
```

## 使ってみる

### サンプルデータを入れる

```shell-session
$ 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
```

### 　検索

```shell-session
$ curl -s http://localhost:8080/search/?query=bad | jq
```

結果

```json
{
  "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"
        }
      }
    ]
  }
}
```

```shell-session
$ curl -s http://localhost:8080/search/?query=Eminem | jq
```

```json
{
  "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"
        }
      }
    ]
  }
}
```

### ドキュメントの取り出し
```shell-session
$ curl -s http://localhost:8080/document/v1/music/music/docid/2
```

```json
{
  "fields": {
    "artist": "Eminem",
    "title": "So Bad",
    "year": 2010,
    "album": "Recovery"
  },
  "id": "id:music:music::2",
  "pathId": "/document/v1/music/music/docid/2"
}
```

## コンテナの終了と削除
試し終わったら、コンテナを終了して削除します。

```shell-session
$ docker stop vespa
$ docker rm vespa
```