全文検索機能
検索機能は、フルテキスト検索を実行する際に使用されるべきであり、具体的には MATCH
または QUERY
の述語が使用されている場合です。いわゆる検索コンテキストの外では、これらの関数は 0
や NULL
のようなデフォルト値を返します。
Elasticsearch SQLは、スコアリングのニーズに応じてElasticsearchに対して実行されるすべてのクエリを最適化します。検索リクエストで track_scores
を使用するか、スコア計算を無効にする _doc
ソート を使用することで、Elasticsearch SQLは、必要ない場合にスコアを計算しないようElasticsearchに指示します。たとえば、SQLクエリ内で SCORE()
関数が遭遇するたびに、スコアが計算されます。
MATCH
概要:
Sql
MATCH(
field_exp,
constant_exp
[, options])
入力:
一致させるフィールド(s) | |
一致させるテキスト | |
追加のパラメータ; オプション |
説明: Elasticsearch SQLで利用可能な述語の形をしたフルテキスト検索オプションで、ユーザーに強力な match および multi_match Elasticsearchクエリの制御を提供します。
最初のパラメータは、一致させるフィールドまたはフィールドのリストです。1つの値のみを受け取った場合、Elasticsearch SQLは match
クエリを使用して検索を実行します:
Sql
SELECT author, name FROM library WHERE MATCH(author, 'frank');
author | name
---------------+-------------------
Frank Herbert |Dune
Frank Herbert |Dune Messiah
Frank Herbert |Children of Dune
Frank Herbert |God Emperor of Dune
ただし、フィールドのリストとそれに対応するオプションの boost
値を受け取ることもできます。この場合、Elasticsearch SQLは multi_match
クエリを使用してドキュメントを一致させます:
Sql
SELECT author, name, SCORE() FROM library WHERE MATCH('author^2,name^5', 'frank dune');
author | name | SCORE()
---------------+-------------------+---------------
Frank Herbert |Dune |11.443176
Frank Herbert |Dune Messiah |9.446629
Frank Herbert |Children of Dune |8.043278
Frank Herbert |God Emperor of Dune|7.0029488
Elasticsearchの multi_match
クエリには、検索対象のフィールドに優先的な重み(スコアリングの観点から)を与える per-field boosting のオプションがあります。上記の例では、name
フィールドは、author
フィールドよりも最終スコアでより大きな重みを持っています。
上記の両方のオプションは、MATCH()
述語のオプションの第3パラメータと組み合わせて使用でき、match
または multi_match
クエリのために追加の設定パラメータ(セミコロン ;
で区切る)を指定できます。たとえば:
Sql
SELECT author, name, SCORE() FROM library WHERE MATCH(name, 'to the star', 'operator=OR;fuzziness=AUTO:1,5;minimum_should_match=1')
ORDER BY SCORE() DESC LIMIT 2;
author | name | SCORE()
-----------------+------------------------------------+---------------
Douglas Adams |The Hitchhiker's Guide to the Galaxy|3.1756816
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
QUERY(
constant_exp
[, options])
入力:
クエリテキスト | |
追加のパラメータ; オプション |
説明: MATCH
と同様に、QUERY
はフルテキスト検索の述語で、ユーザーにElasticsearchの query_string クエリの制御を提供します。
最初のパラメータは基本的に、query_string
クエリにそのまま渡される入力であり、query_string
がその query
フィールドで受け入れるものは何でもここで使用できます:
Sql
SELECT author, name, SCORE() FROM library WHERE QUERY('name:dune');
author | name | SCORE()
---------------+-------------------+---------------
Frank Herbert |Dune |2.2886353
Frank Herbert |Dune Messiah |1.8893257
Frank Herbert |Children of Dune |1.6086556
Frank Herbert |God Emperor of Dune|1.4005898
より高度な例で、query_string
がサポートする機能の多くを示しています。もちろん、Elasticsearch SQLで可能です:
Sql
SELECT author, name, page_count, SCORE() FROM library WHERE QUERY('_exists_:"author" AND page_count:>200 AND (name:/star.*/ OR name:duna~)');
author | name | page_count | SCORE()
------------------+-------------------+---------------+---------------
Frank Herbert |Dune |604 |3.7164764
Frank Herbert |Dune Messiah |331 |3.4169943
Frank Herbert |Children of Dune |408 |3.2064917
Frank Herbert |God Emperor of Dune|454 |3.0504425
Peter F. Hamilton |Pandora's Star |768 |3.0
Robert A. Heinlein|Starship Troopers |335 |3.0
上記のクエリは、_exists_
クエリを使用して、author
フィールドに値があるドキュメントを選択し、page_count
の範囲クエリと name
フィールドの正規表現およびファジー検索を行います。
query_string
が公開するさまざまな設定オプションをカスタマイズする必要がある場合、これは2番目のオプションパラメータを使用して行うことができます。複数の設定をセミコロン ;
で区切って指定できます:
Sql
SELECT author, name, SCORE() FROM library WHERE QUERY('dune god', 'default_operator=and;default_field=name');
author | name | SCORE()
---------------+-------------------+---------------
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
SCORE()
入力: なし
出力: double
数値
説明: 実行されたクエリに対する与えられた入力の 関連性 を返します。スコアが高いほど、データがより関連性があります。
WHERE
句で複数のテキストクエリを行う場合、それらのスコアはElasticsearchの bool query と同じルールを使用して組み合わされます。
通常、SCORE
は、関連性に基づいてクエリの結果を並べ替えるために使用されます:
Sql
SELECT SCORE(), * FROM library WHERE MATCH(name, 'dune') ORDER BY SCORE() DESC;
SCORE() | author | name | page_count | release_date
---------------+---------------+-------------------+---------------+--------------------
2.2886353 |Frank Herbert |Dune |604 |1965-06-01T00:00:00Z
1.8893257 |Frank Herbert |Dune Messiah |331 |1969-10-15T00:00:00Z
1.6086556 |Frank Herbert |Children of Dune |408 |1976-04-21T00:00:00Z
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
``````@