ElasticSearchで検索のプロになる！05.Templateの話

ElasticSearchでは、特にスキーマの設定をしなくとも自動マッピングしてくれますが、使っているとそれでは厳しくなってくる。そこで、マッピングを手動で設定してやりましょうというお話。

やり方は色々あるのですが、普通は設計（Entity-Relation-Diagramなど）して、それを反映すると思うし、そうでないと後で管理が面倒。
ということで、ここではテンプレートファイルを作ってそれを反映してマッピングをするという方法で書きます。

ElasticSearchではあらかじめ特定のインデックスに対して一括で同じ設定を当てはめるという方法があります。

私の場合は特定のIndexに対して一括で同じマッピングの設定を適用させるというもの。
利用目的が日本語での検索なので
・n-Gram
・形態素
この２つの設定はあらかじめ設定しておきたい。その場合のテンプレートの例が以下になります。
こまごました設定がありますが、大まかに説明すると

| キー名 | 説明 |
|:-----------|:------------|
| template | これから書く設定を適用する範囲。sample*とあるのでインデックス名がsampleで始まるものに適用される。 |
| setting| デフォルト設定以外の設定等が必要な場合に追記する。ここでは日本語会席のための設定としてkuromojiとby-gramの設定を記載している。 |
| mapping| マッピングの設定。検索に使うanalyzerなどを指定していて、defultにはない日本語解析系のAnalyzerをsettingに書いたのでそれを利用した。 |

```
{
  "template": "sample*",
    "settings": {
      "analysis" : {
        "analyzer" : {
          "ja-ma-analyzer" : {
            "type" : "custom",
            "tokenizer" : "ja-ma-tokenizer"
		  },
          "ja-2gram-analyzer" : {
            "type" : "custom",
            "tokenizer" : "ja-2gram-tokenizer"
          }
        },
        "tokenizer": {
          "ja-ma-tokenizer": {
            "type": "kuromoji_tokenizer",
            "mode": "normal"
          },
          "ja-2gram-tokenizer": {
            "type" : "nGram",
            "min_gram" : "2",
            "max_gram" : "2"
          }
        }
      }
    },
    "mappings": {
      "_default_" : {
        "dynamic_templates" : [
          {
            "sample_text_for_ma" : {
              "match" : "text-ja-ma",
              "mapping" : {
                "type" : "string",
                "store" : "no",
                "analyzer" : "ja-ma-analyzer"
              }
            }
          },
          {
            "sample_text_for_2gram" : {
              "match" : "text-ja-2gram",
              "mapping" : {
                "type" : "string",
                "store" : "no",
                "analyzer" : "ja-2gram-analyzer"
              }
            }
          }
		]
	  }
    }
  }
}

```

使ったjsonファイルは

```
curl -XPUT http://localhost:9200/_template/main_template?pretty -d @search_template.json
```

そしたらkuromojiなんてねーよってエラーが出た。
なので、手動でkuromojiのプラグインをインストール。
こちらを参考に、Elasticsearchのバージョンにあったものを選びます。
https://github.com/elasticsearch/elasticsearch-analysis-kuromoji
うちの場合は

```
bin/plugin install elasticsearch/elasticsearch-analysis-kuromoji/2.7.0
```

```
[root@VTSRHTS1501:/usr/share/elasticsearch]$ bin/plugin install elasticsearch/elasticsearch-analysis-kuromoji/2.7.0
-> Installing elasticsearch/elasticsearch-analysis-kuromoji/2.7.0...
Trying http://download.elasticsearch.org/elasticsearch/elasticsearch-analysis-kuromoji/elasticsearch-analysis-kuromoji-2.7.0.zip...
Trying http://search.maven.org/remotecontent?filepath=elasticsearch/elasticsearch-analysis-kuromoji/2.7.0/elasticsearch-analysis-kuromoji-2.7.0.zip...
Trying https://oss.sonatype.org/service/local/repositories/releases/content/elasticsearch/elasticsearch-analysis-kuromoji/2.7.0/elasticsearch-analysis-kuromoji-2.7.0.zip...
Trying https://github.com/elasticsearch/elasticsearch-analysis-kuromoji/archive/2.7.0.zip...
Trying https://github.com/elasticsearch/elasticsearch-analysis-kuromoji/archive/master.zip...
Failed to install elasticsearch/elasticsearch-analysis-kuromoji/2.7.0, reason: failed to download out of all possible locations..., use --verbose to get detailed information
```

prvateIPなので、そのままでは当然取得できず。
Proxy使う場合は

```
bin/plugin install elasticsearch/elasticsearch-analysis-kuromoji/2.7.0 -DproxyHost=119.235.233.241 -DproxyPort=9002
```

でオプションに付けてあげればいい。

完了後、リスタート