Elasticsearchインストールと基本操作 for ubuntu

#Elasticsearchインストールと基本操作

###インストール編 (on Ubuntu18.04)

#####ElasticSearch Install

install Java
$ sudo apt install openjdk-11-jdk

install Elasticsearch
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
$ sudo apt update
$ sudo apt install elasticsearch

$ sudo systemctl start elasticsearch
$ sudo systemctl status elasticsearch

確認
$ curl http://127.0.0.1:9200

#####Kibana Install
$ apt update
$ apt install kibana

$ systemctl start kibana

確認
access http://localhost:5601

#####kuromoji Install
$ sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji

###CRUD編
#####bookというインデックスを作成、ドキュメントをひとつ作成。
```python

PUT /book/_doc/1
{
	"title":"ビジネスPython超入門",
	"author":"中島省吾",
	"publisherName":"日経BP",
	"salesDate":"2019年6月7日",
	"itemPrice":"2592"
}
```

#####ドキュメントIDを指定せずに自動生成

```python

PUT /book/_doc
{
	"title":"ビジネスPython超入門",
	"author":"中島省吾",
	"publisherName":"日経BP",
	"salesDate":"2019年6月7日",
	"itemPrice":"2592"
}
※ドキュメントIDは20桁のランダムな英数字になる
```

#####ドキュメントの取得
```python

GET /book/_doc/1
```


#####ドキュメントを更新
```python

POST /book/_update/1
{
  "doc": {
    "itemPrice": 1292
  }
}
```
#####ドキュメントを削除
```python

DELETE /book/_doc/1
```

#####インデックスを削除
```python

GET /book/_mapping
```
#####マッピング（スキーマのようなもの）を確認
```python

GET /book/_mapping
```

#####インデックスを作成
```python

PUT /book
```

#####マッピングを指定してインデックスを作成
```python

PUT /book
{
  "mappings": {
    "properties": {
      "title": { "type": "keyword" },
      "author": { "type": "keyword" },
      "publisherName": { "type": "keyword" },
      "isbn" : { "type": "keyword" },
      "itemCaption" : { "type": "text" },
      "itePrice" : { "type": "long"}
    }
  }
}
```


#####複数のドキュメントを一度に作成
```python

POST /book/_bulk 
{"index": {"_id": 1}} 
{ "title": "退屈なことはPythonにやらせよう", "author": "Al Sweigart/相川愛三","publisherName":" オライリー・ジャパン", "isbn":" 9784873117782", "itemCaption":"ファイル名の変更や表計算のデータ更新といった作業は、日々の仕事の中で頻繁に発生します。ひとつふたつ修正するだけであれば問題ないのですが、それが数十、数百となってくると手に負えません。そのような単純な繰り返し作業はコンピュータに肩代わりしてもらうとすごくラクになります。本書では、手作業だと膨大に時間がかかる処理を一瞬でこなすＰｙｔｈｏｎ３プログラムの作り方について学びます。対象読者はノンプログラマー。本書で基本をマスターすれば、プログラミング未経験者でも面倒な単純作業を苦もなくこなす便利なプログラムを作れるようになります。さらに、章末の練習問題を解くことで、類似のタスクを自動処理するスキルをもっと高めることができます。", "itemPrice": 3996 }
{"index": {"_id": 2}} 
{ "title":" ビジネスPython超入門","author":"中島省吾","publisherName":" 日経 BP","isbn":" 9784296102136","itemCaption":" ビジネスに欠かせないプログラミングの基本スキルが学べる！人工知能で注目の言語、Ｐｙｔｈｏｎを初歩から解説。書き方から実行手順までステップ・バイ・ステップ。条件分岐や繰り返しなどの必須構文を着実にマスター。ネットの情報を自動取得、Ｗｅｂスクレイピングの基礎。手書き文字を認識する機械学習をゼロから体験。","itemPrice": 2592} 
{"index": {"_id": 3}} 
{ "title":"入門Python","author":" ビル・ルバノビック/ 斎藤 康 毅","publisherName":" オライリー・ジャパン"," isbn":" 9784873117386","itemCaption":"Ｐｙｔｈｏｎが誕生して四半世紀。データサイエンスやウェブ開発、セキュリティなどさまざまな分野でＰｙｔｈｏｎの人気が急上昇中です。プログラミング教育の現場でもＣに代わってＰｙｔｈｏｎの採用が増えてきています。本書は、プログラミングが初めてという人を対象に書かれた、Ｐｙｔｈｏｎの入門書です。前提とする知識は特にありません。プログラミングおよびＰｙｔｈｏｎの基礎からウェブ、データベース、ネットワーク、並行処理といった応用まで、Ｐｙｔｈｏｎプログラミングをわかりやすく丁寧に説明します。","itemPrice": 3996}
{"index": {"_id": 4}} 
{ "title":" 新・明解Python入門","author":"柴田望洋","publisherName":"SBクリエイティブ","isbn":"9784815601522","itemCaption":"適切なサンプルプログラム２９９編と分かりやすい図表１６５点で、Ｐｙｔｈｏｎの文法とプログラミングの基礎を系統立てて着実に学習できます。","itemPrice": 2808}
{"index": {"_id": 5}} 
{ "title":"独学プログラマーPython言語の基本から仕事のやり方まで","author":" コーリー・アルソフ/ 清水川 貴之"," publisherName":" 日経BP"," isbn":"9784822292270"," itemCaption":"オブジェクト指向、シェル、正規表現、パッケージ管理、バージョン管理、データ構造、アルゴリズム、仕事の見つけ方・やり方。Ｐｙｔｈｏｎ言語の基本から仕事のやり方まで、プログラマーとして働くために必要な知識・ノウハウが１冊で丸わかり。","itemPrice": 2376}
```


#####ドキュメントに項目を追加
```python

POST /book/_update/5
{
  "doc": {
    "discountRate": 0
  }
}
```

###検索編

#####すべてのドキュメントを検索
```python

GET /book/_searh

GET book/_search
{
    "query": {
    "match_all": {}
  }
}
```

#####指定した単語を含むドキュメントを検索
```python

GET book/_search
{
  "query": {
    "match": {
      "itemCaption": "プログラミング"
    }
  }
}
```

#####and条件でドキュメントを検索
```python

GET book/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "itemCaption": "プログラミング"
          }
        },
        {
          "match": {
            "itemCaption": "入門"
          }
        }
      ]
    }
  }
}
```

#####not検索（ある単語を含まない）
```python

GET book/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "itemCaption": "入門"
          }
        }
      ]
    }
  }
}
```
#####or検索
```python

GET book/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "itemCaption": "プログラミング"
          }
        },
        {
          "match": {
            "itemCaption": "入門"
          }
        }
      ]
    }
  }
}
```

#####特定の単語を重み付けして検索
```python

GET book/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "itemCaption": {
              "query": "プログラミング"
            }
          }
        },
        {
          "match": {
            "itemCaption": {
              "query": "入門",
              "boost": 5
            }
          }
        }
      ]
    }
  }
}
```
#####ハイライト検索
```python

GET book/_search
{
  "query": {
    "match": {
      "itemCaption": "プログラミング"
    }
  },
  "highlight": {
    "fields": {
      "itemCaption": {}
    }
  }
}
```

#####範囲での絞り込み検索およびソート
```python

GET book/_search
{
  "query": {
    "range": {
      "itemPrice": {
        "lte": 3000
      }
    }
  },
  "sort": [
    {
      "itePrice": {
        "order": "asc"
      }
    }
  ]
}
```

#####アグリゲーションを利用して統計データを作成
プログラミングを含むデータを値段範囲ごとにアイテム数を集計

```python

GET book/_search
{
  "query": {
    "match": {
      "itemCaption": "プログラミング"
    }
  }, 
  "aggregations": {
    "itemPrice_bucket": {
      "range": {
        "field": "itemPrice",
        "ranges": [
          {
            "key": "0-1500", 
            "from": 0,
            "to": 1500
          },
          {
            "key": "1501-3000",
            "from": 1501,
            "to": 3000
          },
          {
            "key": "3000-4500",
            "from": 3001,
            "to": 4500
          }
        ]
      }
    }
  }
}
```