Kibanaはじめる

# kibanaについて
## 概要
Kibanaとは、
> KibanaはElastic社が開発している__ビジュアライゼーション__のためのツール[1]

## 動作環境
- elasticsearch: 6.7.1
- kibana: 6.7.1

## 始め方
elasticsearchと同様に導入の仕方は２種類。
### 1. ホストPCにダウンロードする。
### 2. dockerを用いる。(推奨)
詳細は__elasticsearchに関して__を参照

## 使い方
使い方は主に参考サイト[1]を参照。<br>
ただ、データの検索や分析について複雑なのでまとめる。

## 検索queryについて
データをelasticsearchに入れた後の話。<br>
検索や分析のチュートリアルと見てもらっていい。

用いたデータは、[livedoor グルメの研究用データセット](https://github.com/livedoor/datasets)<br>
参考にしたサイトは、[2][Elasticsearch 6 を使ったデータ検証](https://developer-collaboration.com/2018/08/10/elasticsearch-6-1)

### まず文字列を扱う場合、タイプをわけることができる
elasticsearchにてmapping_templateを作成するが、その際データをどのように認識すべきかを設定する。特に文字列については注意が必要。

1. text: 文章を分割して検索する(アナライザーが関与できる。)
2. keyword: 文字列は分割されない(アナライザーが関与できない。)

＊アナライザーが関与するとは？<br>
例えば、「ラーメン　カレー」で検索する。
1. 文字列がtext型の場合<br>
「ラーメンの「風香」」-> 「ラーメン」「の」「風香」
となるため検索結果にヒットする。
2. 文字列がkeyword型の場合<br>
「ラーメンの「風香」 -> 「ラーメンの「風香」」
となるため検索結果にヒットされない。<br>
加えて、語順も重要視する。<br>
「ラーメンとカレーの「松屋」」はヒットするが、「カレーとラーメンの...」はヒットしない。

## text型の検索(文字列の部分一致)について
### 1.「地名 料理ジャンル/店名」と言った形でレストランを探す
クエリ例

```
{
   "query" : {
     "simple_query_string" : {
       "query": "目黒 とんき",
       "fields": ["name", "name_kana", "address"],
       "default_operator": "and"
     }
   }
}
```

 - simple_query_string: 便利クエリのひとつ。
  - query: 検索したい文字列
  - fields: 検索する場所(対象)
  - default_operator: 演算子（AND, ORなど）


  (注意点)ver6からはfieldsに___all__を利用できない。

### 2.PV順・口コミが多い順・評価が高い順など検索結果をソート
クエリ例

```
{
   "query" : {
     "simple_query_string" : {
       "query": "東京 ラーメン",
       "fields": ["name", "name_kana", "address"],
       "default_operator": "and"
     }
   },
   "sort" : [{ "access_count" : {"order" : "desc", "missing" : "_last"}}]
}
```

- simple_query_string: 1.と同様。
- sort: 検索結果をsortするための条件
  - access_count: sortしたい項目（_access_count_ はmapping_templateで設定した項目）
    - order: __asc__: 昇順, __desc__: 降順
    - missing: データにsortしたい項目がなかった場合、どのように配置するかということ。
    __ _last__: 最後に配置, __ _first__: 最初に配置<br> ＊defaultは___last__<br>

＊sortのdocumentは、[こちら](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-sort.html)

### 3. ドキュメントのスコアを自分で定義する
条件のなかで優先するものを決めてその項目が一番当てはまるものを探すことができる。<br>
具体的には各条件にweightを設定する。<br>
クエリ例

```
{
   "query" : {
     "function_score" : {
       "query" : {
         "simple_query_string" : {
           "query": "ハンバーガー",
           "fields": ["name", "name_kana", "address"],
           "default_operator": "and"
         }
       },
       "score_mode": "sum",
       "boost_mode": "replace",
       "functions" : [
         {
           "filter" : { "range" : { "access_count" : { "from" : 500 }}},
           "weight" : 10
         },
         {
           "filter" : { "range" : { "photo_count" : { "from" : 3 }}},
           "weight" : 10
         },
         {
           "filter" : { "geo_distance" : { "distance" : "2km", "location" : [139.43 , 35.38] }},
           "weight" : 100
         }
       ]
     }
   }
}
```

＊詳細な検索をしたい場合は、__function_score__ を使う。<br>
＊documentは[こちら](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html)<br>
＊クエリの様々な使い方は、[こちら](https://qiita.com/yosu/items/b2d837ebe95049e9556e#%E3%81%9D%E3%81%AE%E4%BB%96)
- function_score
  - query: simple_query_stringと同様。
  - score_mode: スコアの計算方法。（以下の表に記載）
  - boost_mode: クエリのスコアの計算方法（以下の表に記載）
  - functions: 設定するqueryと重さ

#### ＊score_modeとboost_modeの違い
- score_mode: functionsで設定した重さを指定したクエリに対して演算(デフォルトは積)した値
- boost_mode: 元々のqueryの値にある値を演算(デフォルトは積)した結果とscore_modeの値を組み合わせた値

```
functionsのスコア = score_mode(f1*w1, f2*w2, ...)
- fx: 各functionの値
- wx: 各functionの重さ
- fxとwxの演算は任意（デフォルトは積）
```

```
function_scoreのスコア = boost_mode(queryスコア * boost, functionsスコア)
- queryスコアとboostの演算は任意（デフォルトは積）
```

＊score_modeのパラメータ

| param    |                          |
|----------|--------------------------|
| multiply | 各条件の積               |
| sum      | 各条件の総和             |
| avg      | 各条件の平均(重さ平均)   |
| first    | 最初に適合した条件を使う |
| max      | 最大値をとる条件を使う   |
| min      | 最小値をとる条件を使う   |

＊boost_modeのパラメータ

| param    |                                        |
|----------|----------------------------------------|
| multiply | query_scoreとfunctions_scoreの積       |
| replace  | function_scoreのみ使う                 |
| sum      | query_scoreとfunctions_scoreの和       |
| avg      | query_scoreとfunctions_scoreの平均     |
| max      | query_scoreとfunctions_scoreの大きい方 |
| min      | query_scoreとfunctions_scoreの小さい方 |

## keyword型の検索(文字列の全一致)について
いろいろある。詳しくは、[こちら](https://developer-collaboration.com/2018/08/17/elasticsearch-6-5/)

## aggregationを用いた分析
データの分析を行うのに用いる。ログを解析する時とか使えそう。
## analyzerについて
今回は日本語の分析だったのでkuromojiを用いたがデータの解析をする場合は違うものを使ったほうがいいかも。

## 参考サイト
[1][Kibanaで簡単! サクサク ビジュアライズしよう！](https://qiita.com/kitfactory/items/9c2f990d87e33fab828a)<br>
[2][Elasticsearch 6 を使ったデータ検証](https://developer-collaboration.com/2018/08/10/elasticsearch-6-1)