LIKEおよびRLIKE演算子
LIKE
およびRLIKE
演算子は、文字列パターンに基づいてデータをフィルタリングするために一般的に使用されます。通常、演算子の左側に配置されたフィールドに作用しますが、定数(リテラル)式にも作用することがあります。演算子の右側はパターンを表します。両方ともWHERE
句のSELECT
ステートメントで使用できますが、LIKE
は、インデックスパターンの定義や、さまざまなSHOWコマンドで使用することもできます。このセクションではSELECT ... WHERE ...
の使用法のみを扱います。
LIKE
/RLIKE
と全文検索述語の間の重要な違いは、前者が正確なフィールドに作用するのに対し、後者は分析されたフィールドにも作用することです。LIKE
/RLIKE
と共に使用されるフィールドに正確な非正規化サブフィールド(keywordタイプ)がない場合、Elasticsearch SQLはクエリを実行できません。フィールドが正確であるか、正確なサブフィールドを持っている場合、それはそのまま使用されるか、ステートメントで明示的に指定されていなくても自動的に正確なサブフィールドが使用されます。
LIKE
概要:
Sql
expression
LIKE constant_exp
通常はフィールドまたは定数式 | |
パターン |
説明: SQL LIKE
演算子は、ワイルドカード演算子を使用して値を類似の値と比較するために使用されます。LIKE
演算子と共に使用される2つのワイルドカードがあります:
- パーセント記号 (%)
- アンダースコア (_)
パーセント記号は、ゼロ、1、または複数の文字を表します。アンダースコアは、単一の数字または文字を表します。これらの記号は組み合わせて使用できます。
他の文字は特別な意味を持たず、ワイルドカードとして機能しません。他の言語でワイルドカードとしてよく使用される文字(*
または?
)は、通常の文字として扱われます。
Sql
SELECT author, name FROM library WHERE name LIKE 'Dune%';
author | name
---------------+---------------
Frank Herbert |Dune
Frank Herbert |Dune Messiah
ワイルドカード文字自体を一致させる必要がある場合、エスケープ文字を使用する可能性もあります。これは、LIKE ...
演算子の後にESCAPE [escape_character]
ステートメントを使用することで行えます:
SELECT name, author FROM library WHERE name LIKE 'Dune/%' ESCAPE '/';
上記の例では、/
はエスケープ文字として定義されており、パターン内でそれらの文字を特に一致させる必要がある場合は、%
または_
文字の前に置く必要があります。デフォルトでは、エスケープ文字は定義されていません。
LIKE
はElasticsearch SQLで検索またはフィルタリングする際の有効なオプションですが、全文検索述語MATCH
およびQUERY
はより速く、はるかに強力で、好ましい代替手段です。
RLIKE
概要:
Sql
expression
RLIKE constant_exp
通常はフィールドまたは定数式 | |
パターン |
説明: この演算子はLIKE
に似ていますが、ユーザーはパーセント記号(%
)やアンダースコア(_
)を使用して固定パターンに基づいて文字列を検索することに制限されません。この場合のパターンは正規表現であり、より柔軟なパターンの構築を可能にします。
サポートされている構文については、正規表現構文を参照してください。
Sql
SELECT author, name FROM library WHERE name RLIKE 'Child.* Dune';
author | name
---------------+----------------
Frank Herbert |Children of Dune
RLIKE
はElasticsearch SQLで検索またはフィルタリングする際の有効なオプションですが、全文検索述語MATCH
およびQUERY
はより速く、はるかに強力で、好ましい代替手段です。
全文検索述語を優先する
LIKE
/RLIKE
を使用する際は、全文検索述語を使用することを検討してください。これらはより速く、はるかに強力で、関連性によるソートのオプションを提供します(結果はどれだけ一致したかに基づいて返されることがあります)。
例えば:
LIKE/RLIKE | QUERY/MATCH |
foo LIKE 'bar' |
MATCH(foo, 'bar') |
foo LIKE 'bar' AND tar LIKE 'goo' |
MATCH('foo^2, tar^5', 'bar goo', 'operator=and') |
foo LIKE 'barr' |
QUERY('foo: bar~') |
foo LIKE 'bar' AND tar LIKE 'goo' |
QUERY('foo: bar AND tar: goo') |
foo RLIKE 'ba.*' |
MATCH(foo, 'ba', 'fuzziness=AUTO:1,5') |
foo RLIKE 'b.{1}r' |
MATCH(foo, 'br', 'fuzziness=1') |