全文検索機能

検索機能は、フルテキスト検索を実行する際に使用されるべきであり、具体的には MATCH または QUERY の述語が使用されている場合です。いわゆる検索コンテキストの外では、これらの関数は 0NULL のようなデフォルト値を返します。

Elasticsearch SQLは、スコアリングのニーズに応じてElasticsearchに対して実行されるすべてのクエリを最適化します。検索リクエストで track_scores を使用するか、スコア計算を無効にする _doc ソート を使用することで、Elasticsearch SQLは、必要ない場合にスコアを計算しないようElasticsearchに指示します。たとえば、SQLクエリ内で SCORE() 関数が遭遇するたびに、スコアが計算されます。

MATCH

概要:

Sql

  1. MATCH(
  2. field_exp,
  3. constant_exp
  4. [, options])

入力:

一致させるフィールド(s)
一致させるテキスト
追加のパラメータ; オプション

説明: Elasticsearch SQLで利用可能な述語の形をしたフルテキスト検索オプションで、ユーザーに強力な match および multi_match Elasticsearchクエリの制御を提供します。

最初のパラメータは、一致させるフィールドまたはフィールドのリストです。1つの値のみを受け取った場合、Elasticsearch SQLは match クエリを使用して検索を実行します:

Sql

  1. SELECT author, name FROM library WHERE MATCH(author, 'frank');
  2. author | name
  3. ---------------+-------------------
  4. Frank Herbert |Dune
  5. Frank Herbert |Dune Messiah
  6. Frank Herbert |Children of Dune
  7. Frank Herbert |God Emperor of Dune

ただし、フィールドのリストとそれに対応するオプションの boost 値を受け取ることもできます。この場合、Elasticsearch SQLは multi_match クエリを使用してドキュメントを一致させます:

Sql

  1. SELECT author, name, SCORE() FROM library WHERE MATCH('author^2,name^5', 'frank dune');
  2. author | name | SCORE()
  3. ---------------+-------------------+---------------
  4. Frank Herbert |Dune |11.443176
  5. Frank Herbert |Dune Messiah |9.446629
  6. Frank Herbert |Children of Dune |8.043278
  7. Frank Herbert |God Emperor of Dune|7.0029488

Elasticsearchの multi_match クエリには、検索対象のフィールドに優先的な重み(スコアリングの観点から)を与える per-field boosting のオプションがあります。上記の例では、name フィールドは、author フィールドよりも最終スコアでより大きな重みを持っています。

上記の両方のオプションは、MATCH() 述語のオプションの第3パラメータと組み合わせて使用でき、match または multi_match クエリのために追加の設定パラメータ(セミコロン ; で区切る)を指定できます。たとえば:

Sql

  1. SELECT author, name, SCORE() FROM library WHERE MATCH(name, 'to the star', 'operator=OR;fuzziness=AUTO:1,5;minimum_should_match=1')
  2. ORDER BY SCORE() DESC LIMIT 2;
  3. author | name | SCORE()
  4. -----------------+------------------------------------+---------------
  5. Douglas Adams |The Hitchhiker's Guide to the Galaxy|3.1756816
  6. Peter F. Hamilton|Pandora's Star |3.0997515

単一フィールド MATCH() バリアント(match Elasticsearchクエリ)のために許可されるオプションのパラメータは: analyzer, auto_generate_synonyms_phrase_query, lenient, fuzziness, fuzzy_transpositions, fuzzy_rewrite, minimum_should_match, operator, max_expansions, prefix_length.

マルチフィールド MATCH() バリアント(multi_match Elasticsearchクエリ)のために許可されるオプションのパラメータは: analyzer, auto_generate_synonyms_phrase_query, lenient, fuzziness, fuzzy_transpositions, fuzzy_rewrite, minimum_should_match, operator, max_expansions, prefix_length, slop, tie_breaker, type.

QUERY

概要:

Sql

  1. QUERY(
  2. constant_exp
  3. [, options])

入力:

クエリテキスト
追加のパラメータ; オプション

説明: MATCH と同様に、QUERY はフルテキスト検索の述語で、ユーザーにElasticsearchの query_string クエリの制御を提供します。

最初のパラメータは基本的に、query_string クエリにそのまま渡される入力であり、query_string がその query フィールドで受け入れるものは何でもここで使用できます:

Sql

  1. SELECT author, name, SCORE() FROM library WHERE QUERY('name:dune');
  2. author | name | SCORE()
  3. ---------------+-------------------+---------------
  4. Frank Herbert |Dune |2.2886353
  5. Frank Herbert |Dune Messiah |1.8893257
  6. Frank Herbert |Children of Dune |1.6086556
  7. Frank Herbert |God Emperor of Dune|1.4005898

より高度な例で、query_string がサポートする機能の多くを示しています。もちろん、Elasticsearch SQLで可能です:

Sql

  1. SELECT author, name, page_count, SCORE() FROM library WHERE QUERY('_exists_:"author" AND page_count:>200 AND (name:/star.*/ OR name:duna~)');
  2. author | name | page_count | SCORE()
  3. ------------------+-------------------+---------------+---------------
  4. Frank Herbert |Dune |604 |3.7164764
  5. Frank Herbert |Dune Messiah |331 |3.4169943
  6. Frank Herbert |Children of Dune |408 |3.2064917
  7. Frank Herbert |God Emperor of Dune|454 |3.0504425
  8. Peter F. Hamilton |Pandora's Star |768 |3.0
  9. Robert A. Heinlein|Starship Troopers |335 |3.0

上記のクエリは、_exists_ クエリを使用して、author フィールドに値があるドキュメントを選択し、page_count の範囲クエリと name フィールドの正規表現およびファジー検索を行います。

query_string が公開するさまざまな設定オプションをカスタマイズする必要がある場合、これは2番目のオプションパラメータを使用して行うことができます。複数の設定をセミコロン ; で区切って指定できます:

Sql

  1. SELECT author, name, SCORE() FROM library WHERE QUERY('dune god', 'default_operator=and;default_field=name');
  2. author | name | SCORE()
  3. ---------------+-------------------+---------------
  4. Frank Herbert |God Emperor of Dune|3.6984892

QUERY() に対して許可されるオプションのパラメータは: allow_leading_wildcard, analyze_wildcard, analyzer, auto_generate_synonyms_phrase_query, default_field, default_operator, enable_position_increments, escape, fuzziness, fuzzy_max_expansions, fuzzy_prefix_length, fuzzy_rewrite, fuzzy_transpositions, lenient, max_determinized_states, minimum_should_match, phrase_slop, rewrite, quote_analyzer, quote_field_suffix, tie_breaker, time_zone, type.

SCORE

概要:

Sql

  1. SCORE()

入力: なし

出力: double 数値

説明: 実行されたクエリに対する与えられた入力の 関連性 を返します。スコアが高いほど、データがより関連性があります。

WHERE 句で複数のテキストクエリを行う場合、それらのスコアはElasticsearchの bool query と同じルールを使用して組み合わされます。

通常、SCORE は、関連性に基づいてクエリの結果を並べ替えるために使用されます:

Sql

  1. SELECT SCORE(), * FROM library WHERE MATCH(name, 'dune') ORDER BY SCORE() DESC;
  2. SCORE() | author | name | page_count | release_date
  3. ---------------+---------------+-------------------+---------------+--------------------
  4. 2.2886353 |Frank Herbert |Dune |604 |1965-06-01T00:00:00Z
  5. 1.8893257 |Frank Herbert |Dune Messiah |331 |1969-10-15T00:00:00Z
  6. 1.6086556 |Frank Herbert |Children of Dune |408 |1976-04-21T00:00:00Z
  7. 1.4005898 |Frank Herbert |God Emperor of Dune|454 |1981-05-28T00:00:00Z

ただし、スコアで並べ替えずにスコアを返すことも完全に問題ありません:

Sql

``````sql
SELECT SCORE() AS score, name, release_date FROM library WHERE QUERY(‘dune’) ORDER BY YEAR(release_date) DESC;

score | name | release_date
———————-+—————————-+——————————
1.4005898 |God Emperor of Dune|1981-05-28T00:00:00Z
1.6086556 |Children of Dune |1976-04-21T00:00:00Z
1.8893257 |Dune Messiah |1969-10-15T00:00:00Z
2.2886353 |Dune |1965-06-01T00:00:00Z
``````@