Elasticsearch 勉強メモ


[実践！Elasticsearch](http://engineer.wantedly.com/2014/02/25/elasticsearch-at-wantedly-1.html) をやっていた時の勉強メモが残っていたので公開しておきます。

# 基礎
## Indexフェーズ

### ドキュメントの解析
[Analysis](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis.html)

Full Text -> Termsにする作業。
日本語だと形態素解析に当たる重要な部分。

解析の流れ：
CharFilters(複数) -> Tokenizer(1つ) -> TokenFilter(複数)

TokenFilterではストップワードを除いたりもできる


### ドキュメントの追加削除、取得など

[Document API](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs.html)


### Index Module

[Index Module](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules.html)

## Searchフェーズ


### フィルター

[Filter](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-filters.html)

検索をYes/Noの2値や日付やGeoLocation、キーワードの一致などExact Machの検索を行うときは以下のQueryではなくFilterを使う。
また、Queryと異なりキャッシュすることができる。


### クエリ

[Query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-queries.html)

全文検索を行い、適合度によりランク付けしたいときには上のFilterではなくQueryを使う。



### 検索関連機能

[Search APIs](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search.html)


- uri search
 - GETで簡単に検索する
- request body search
 - POSTで色々設定して検索できる
- facets
 - 検索を元に統計的な分析ができる
- suggesters
 - Suggest機能。使うには[Phrase Suggester](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-phrase.html)サーバーを用意する。
 - 入力補助用としてPrefixを元にする[Completion Suggester](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-completion.html)
- multi search api
 - 複数クエリを同時に投げられる
- count api
 - 検索結果の数を返してくれる
- validate api
 - 検索結果を返さずに、その検索をしてエラーが出ないかどうかだけを返してくれる
- explain api
 - デバッグ用にスコアリングの説明を出してくれる
- percolate api
 - よくわからん。TwitterのTimeLine検索みたいなのを作りたいときに使える？？
- more like this api
  - [MoreLikeThis Query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-mlt-query.html)を発行

# ElasticSearchのスコアリング

## INDEX時

### [Mappingの_boostフィールド](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-boost-field.html)

この方法では、Index時に、あるフィールドやドキュメントのスコアをブーストしておくことができる。例としてはPageRankのストアに使える。


## 検索時 

### [Similarity Module](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules-similarity.html)

FullTextSearchにおけるクエリとドキュメントの適合度を求めるモジュール

### [Constant Score Query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-constant-score-query.html)

return 0.5 if match

### [Boosting Query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-boosting-query.html)

return 0.5 * original_score if match

### [Function Score Query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html)

return 0.5 * original_score + freshness_score if match


Functionを書くときに使える言語の解説:

- [Scripting](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html)
- [Text Scoring in Script](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-advanced-scripting.html)


### [Index Boost](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-index-boost.html)

２つのIndexの重み付けを定義できる

### [Rescoreing](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-rescore.html)

より計算コストの高いスコアリングをTop100-500などのドキュメントに対して行うときに使う


### 参考

- http://jaibeermalik.wordpress.com/2013/04/10/elasticsearch-boosting-score-for-content-relevancy/