Elasticsearch 6.2.0 で More Like This Query を利用する際のパラメータについてまとめた

Elasticsearch で More Like This Query を使って類似文書検索を行う際に設定できるパラメータについて調べてみました。
内容としては以下のドキュメントをまとめたものになります。
[More Like This Query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-mlt-query.html)

手元の環境は以下になります。

* Ubuntu 16.04 LTS
* Elasticsearch 6.2.0

### More Like This Query で実現できること

* 任意のテキスト文字列と類似した文書を検索することができる
* インデクシング済みの文書（単数/複数）と類似した文書を検索することができる
* 任意のテキスト文字列とインデクシング済みの文書を混合させて、類似した文書を検索することができる
* インデックスに存在しない文書も混合させることができる

注意点としては以下のようなものがあります。

* 検索対象のフィールドタイプは一致している必要がある（text または keyword 。デフォルトだと fields で指定したフィールドのタイプになる）
* 複数の文書と類似した文書を検索する場合は、\_source を有効にするかフィールドの store を有効にするか、term\_vector を有効にする必要がある

### Document Input Parameters

入力データを指定する際のパラメータ(※印が付いているものは6.4のドキュメントに記載されているもの)

* like
必須パラメータ。任意のテキスト文字列や複数の文書を指定できる。インデックスに無い文書も指定可能。
per_field_analyzer でフィールドごとの analyzer を上書きして指定することも可能。

* unlike
類似させたくない条件を指定する。例えば「Apple」に対してケーキや果物の内容の文書を類似させたくない場合など。
指定方法は like と同じ。

* fields
解析対象となるフィールド

* like_text※
任意のテキスト文字列（like パラメータで同じことが実現可能と思われる）

* ids or docs※
文書IDのリスト（like パラメータで同じことが実現可能と思われる）

### Term Selection Parameters

単語の扱いを指定する際のパラメータ

* max_query_terms
初期値は 25。実行するクエリをどれくらいの単語数で生成するか。数値が大きいほど重要度の低い単語も検索対象になる。

* min_term_freq
初期値は 2。文書中に出現する単語について、どのくらいの出現数から検索に考慮するか。（例：文書中に1回しか出現しない単語は検索に考慮しない）

* min_doc_freq
初期値は 5。総文書中でどのくらいの文書で出現する単語から検索に考慮するか。（例：総文書中で4文書にしか出現しない単語は考慮しない）

* max_doc_freq
初期値は無制限。総文書中でどのくらいの文書で出現する単語までを検索に考慮するか。

* min_word_length
初期値は 0。どれくらいの長さの単語から検索に考慮するか。

* max_word_length
初期値は無制限。どれくらいの長さの単語まで検索に考慮するか。

* stop_words
除外文字列。配列で指定する。（検索のスコア付けの際に除外するだけなので、検索結果に含めたくない場合は Bool Query の must_not などを利用する）

* analyzer
任意のテキスト文字列を指定した場合のanalyzer。デフォルトだと fields で指定した最初のフィールドのタイプ。

### Query Formation Parameters

クエリの扱いを指定する際のパラメータ

* minimum_should_match
初期値は 30%。どれくらい一致していれば検索にヒットさせるかの最低値。（1：1 単位（1 単語？）、30%：比較元の 30% （小数点切捨て）、-2：総数から 2 を引いたもの、-25%：比較元から 25% （小数点切捨て）引いたもの、3<90%：範囲指定）

* fail_on_unsupported_field
初期値は true。検索対象のフィールドタイプに問題があった場合に検索が失敗させるかどうか。

* boost_terms
初期値は 0。検索に使用する全ての単語にブーストをかける。（特定の単語のみをブーストしたい場合は [Function Score Query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html) などを利用する）

* include
初期値は false。検索結果に比較元のデータを含めるか。含めた場合は検索結果の最初のデータが比較元になる。

* boost
初期値は 1.0。実行するクエリそのものにブーストをかける。

### その他

クエリ実行時にデータを絞り込みたい場合は [以前書いた記事](https://qiita.com/nettle0010/items/0ed91340e3fa5c04804c)  のように filter を使うと実現できて、個別のフィールドごとに調整したい場合は [Dis Max Query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-dis-max-query.html) などを使うと実現できそうです。

### 参考になった記事
[Elasticsearch での類似文書検索と More Like This Query API 詳解](https://speakerdeck.com/takuyaa/elasticsearch-defalselei-si-wen-shu-jian-suo-to-more-like-this-query-api-xiang-jie?slide=29)
[More Like This Query documentation - remove reference to "ids" and "like_text" parameter #28128](https://github.com/elastic/elasticsearch/issues/28128)
[Elasticsearch CheatSheet](https://qiita.com/ikawaha/items/228ee3f481e9636b3065)
[More_this_thisクエリ関する質問](https://discuss.elastic.co/t/more-this-this/59520)
[Boosting in more like this elasticsearch](https://stackoverflow.com/questions/26863350/boosting-in-more-like-this-elasticsearch)