Elasticsearch CheatSheet

備忘φ(．．)メモ．

**この記事に書いてあることはだいぶ古いです．**

# 参考

* [高速スケーラブル検索エンジン ElasticSearch Server](http://www.amazon.co.jp/gp/product/4048662023/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4048662023&linkCode=as2&tag=foxii-22)
* [Elasticsearch: Document APIs](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs.html)

## Basics

### REST Request Type 

|Request Type|用途         |
|:-----------|:-----------| 
|GET         |オブジェクトの現在の状態を得る|
|POST        |オブジェクトの状態を変更|
|PUT         |オブジェクトを生成|
|DELETE      |オブジェクトを破棄|

## API

|用途           |Request Type|End Point| ex.| remarks|
|:-------------|:-----------|:------------|:---|:--|
|インデックス作成|PUT   | /\<index> |curl -XPOST 'localhost:9200/piyo' -d @mapping.json||
|インデックス削除|DELETE | /\<index> | /piyo||
|テンプレート作成|PUT   | /\_template/\<template>|/piyo -d @template.json||
|テンプレート一覧|GET    | /\_template/\<template>|/piyo_tmplate -d @template.json||
|テンプレート削除|DELETE | /\_template/\<template>| /piyo_tmplate||
|ドキュメント更新|POST   | /\<index>/\<type>/\<id>/\_update|/piyo/doc/1/_update -d '{"text": "hello"}'|更新は一部のフィールドだけを指定可|
|ドキュメント削除|DELETE   | /\<index>/\<type>/\<id>|/piyo/doc/1||
|エイリアス取得|GET|/_aliases, /\<index>/\_aliases|/\_aliases||
|エイリアス作成/削除|POST|/\_aliases|/\_aliases -d @alias.json|別途記載|
|設定確認|GET|/\_settings, /\<index>/\_settings|/piyo/\_settings|filterとかtokenizerとかの確認はこっち|
|schema確認|GET|/\_mappings, /\<index>/\_mappings|/piyo/\_mappings|schemaの確認はこちら|

### エイリアス

```:作成
curl -XPOST 'localhost:9200/_aliases' -d '{
  "actions": [
    {"remove": {"index": "piyo_201409", "alias" : "piyo"}},
    {"add": {"index": "piyo_201410", "alias" : "piyo"}},
    {"add": {"index": "piyo_201411", "alias" : "piyo"}},
    {"add": {"index": "piyo_201412", "alias" : "piyo"}}
  ]
}'
```


## Query

メモ：Elasticsearch 的にはリクエストタイプは GET でも POST でも大丈夫なんだけど，kopf で REST 使うときは POST に設定しておかないと body が送られないようなので注意．

![kopf.png](https://qiita-image-store.s3.amazonaws.com/0/44487/ba093a3b-f64f-ef08-56c3-d9829c2cf7b2.png)


|No.|用途|例|
|:--|:---|:---|
|1|全インデックスへのリクエスト|curl -XGET 'localhost:9200/_search' -d @query.json|
|2|インデックスへのみ指定|curl -XGET 'localhost:9200/piyo/_search' -d @query.json|
|3|インデックスとタイプを指定|curl -XGET 'localhost:9200/piyo/doc/_search' -d @query.json|
|4|複数のインデックスを指定|curl -XGET 'localhost:9200/piyo,foo,baa/_search' -d @query.json|
|5|複数のインデックスとタイプを指定|curl -XGET 'localhost:9200/piyo,foo,baa/doc,book,log/_search' -d @query.json|

### 単純な例

単語「piyo」でtitleフィールドを検索．

```
curl -XGET 'localhost:9200/<index>/<doc_type>/_search?q=title:piyo'
```

### term

アナライズされない検索

```json:term
{
  "query" : {
    "term" : { "title" : "piyo" }
  }
}
```

### match

アナライズされる検索

```json:term
{
  "query" : {
    "match" : { "title" : "piyo" }
  }
}
```

### boolean match

```json:titleフィールドにfooとbaaが含まれているもの．
{
  "query" : {
    "match" : { 
      "title" : {
        "query": "foo baa",
        "operator" : "and"
      }
    }
  }
}
```

### phrase match

フレーズ検索

```json:fooとbaaの間に未知の単語をslop個許容したフレーズを検索
{
  "query" : {
    "match_phrase" : {
      "title" : {
        "query" : "foo baa",
        "slop" : 1
      }
    }
  }
}
```

### match phrase prefix

フレーズ検索の末尾を緩くマッチさせる

最後の語句を前方一致させていくつの語句を書き換えるかと云ったことをするものらしい．

```json:フレーズの末尾にmax_expansions個だけ語句をマッチさせる
{
  "query" : {
    "match_phrase" : {
      "title" : {
        "query" : "foo baa",
        "slop" : 1,
        "max_expansions" : 20,
      }
    }
  }
}
```

### multi match

クエリを複数フィールドにあてる

```json:multi_match
{
  "query" : {
    "multi_match" : {
      "query" : "foo baa",
      "fields" : ["title", "content"]
    }
  }
}
```

### query string

Lucene のクエリを使う

TODO

### field query

query string の簡易版

```json:foo必須，baaオプション，piyo含まない
{
  "query" : {
    "field" : {
      "title" : "+foo baa -piyo"
    }
  }
}
```

### IDs query

列挙した値で検索
未検証：文字列でもいいのかな？

```json:ids
{
  "query" : {
    "ids" : {
      "values" : ["1", "3", "5"]
    }
  }
}
```

### prefix query

term クエリの prefix 指定版

```json:
{
  "query" : {
    "prefix" : {
      "title" : "pi"
    }
  }
}
```

### more like this

指定されたテキストに似ているドキュメントを検索

|オプション|動作|
|:--------|:---|
|fields|クエリが対象にするフィールド(_all)|
|percent_terms_to_match|似ているドキュメントにマッチする語句のパーセンテージ(0.30)|
|min_term_freq|ソースドキュメントに含まれる語句の頻度の最小値がこの値よりも低いものは無視(2)|
|min_doc_freq|この値で示されるドキュメント数含まれていない語句は無視(5)|
|max_doc_freq|この値で示されるドキュメント数より多く含まれる語句は無視(0:制限なし)|
|max_query_terms|生成されるクエリの語句の最大を指定|
|stop_words|無視される単語の配列を指定|
|min_word_length|この値で指定される長さ以下の単語は無視(0)|
|max_word_length|この値で指定される長さ以上の単語は無視(0:制限なし)|
|boost_terms|各語句をブーストするときの値(1)|
|boost|クエリをブーストするときの値(1)|
|analyzer|使用するアナライザ|


```json:
{
  "query" : {
    "more_like_this" : {
      "fields" : ["title", "content"],
      "like_text" : "piyo foo baa"
    }
  }
}
```

### more like this field

more like this のフィールド指定版

```json:
{
  "query" : {
    "more_like_this_field" : {
      "title" {
        "like_text" : "piyo foo baa"
      }
    }
  }
}
```

### fuzzy like this query

more like this に似てるけど，なるべく異なるドキュメントを検索する

```json:
{
  "query" : {
    "fuzzy_like_this" : {
      "fields" : ["title", "content"],
      "like_text" : "piyo foo baa"
    }
  }
}
```

### fuzzy like this field query

fuzzy like this query のフィールド指定版

```json:
{
  "query" : {
    "fuzzy_like_this_field" : {
      "title" {
        "like_text" : "piyo foo baa"
      }
    }
  }
}
```

### wild card query

~~性能悪い~~パフォーマンスに影響出るのでむやみに使わないこと

```json:
{
  "query" : {
    "wildcard" : {
      "title" : "pi?yo"
    }
  }
}
```

### range query

範囲検索

```json:
{
  "query" : {
    "range" : {
      "ctime" : {
        "from" : "2014-10-21T18:47+0900",
        "to" : "2014-10-22T10:47+0900"
      }
    }
  }
}
```

## Query Options

### 取得するフィールドの指定

```json:fields
  "fields" : ["title", "content", "ctime"],
  "query" : {
    "match" : { "title" : "piyo" }
  }
}
```

### カウント

`search_type` リクエストパラメータに指定する．エイリアス指定している場合は使えない？

```
curl -XGET 'localhost:9200/<index>/<doc_type>/_search?q=title:piyo&search_type=count'
```

### ページング

```json:paging
{
  "from" : 9,
  "to"   : 20,
  "query": {
    "match" : { "title" : "piyo" }
  }
}
```