LIKEおよびRLIKE演算子

LIKEおよびRLIKE演算子は、文字列パターンに基づいてデータをフィルタリングするために一般的に使用されます。通常、演算子の左側に配置されたフィールドに作用しますが、定数(リテラル)式にも作用することがあります。演算子の右側はパターンを表します。両方ともWHERE句のSELECTステートメントで使用できますが、LIKEは、インデックスパターンの定義や、さまざまなSHOWコマンドで使用することもできます。このセクションではSELECT ... WHERE ...の使用法のみを扱います。

LIKE/RLIKE全文検索述語の間の重要な違いは、前者が正確なフィールドに作用するのに対し、後者は分析されたフィールドにも作用することです。LIKE/RLIKEと共に使用されるフィールドに正確な非正規化サブフィールド(keywordタイプ)がない場合、Elasticsearch SQLはクエリを実行できません。フィールドが正確であるか、正確なサブフィールドを持っている場合、それはそのまま使用されるか、ステートメントで明示的に指定されていなくても自動的に正確なサブフィールドが使用されます。

LIKE

概要:

Sql

  1. expression
  2. LIKE constant_exp
通常はフィールドまたは定数式
パターン

説明: SQL LIKE演算子は、ワイルドカード演算子を使用して値を類似の値と比較するために使用されます。LIKE演算子と共に使用される2つのワイルドカードがあります:

  • パーセント記号 (%)
  • アンダースコア (_)

パーセント記号は、ゼロ、1、または複数の文字を表します。アンダースコアは、単一の数字または文字を表します。これらの記号は組み合わせて使用できます。

他の文字は特別な意味を持たず、ワイルドカードとして機能しません。他の言語でワイルドカードとしてよく使用される文字(*または?)は、通常の文字として扱われます。

Sql

  1. SELECT author, name FROM library WHERE name LIKE 'Dune%';
  2. author | name
  3. ---------------+---------------
  4. Frank Herbert |Dune
  5. Frank Herbert |Dune Messiah

ワイルドカード文字自体を一致させる必要がある場合、エスケープ文字を使用する可能性もあります。これは、LIKE ...演算子の後にESCAPE [escape_character]ステートメントを使用することで行えます:

  1. SELECT name, author FROM library WHERE name LIKE 'Dune/%' ESCAPE '/';

上記の例では、/はエスケープ文字として定義されており、パターン内でそれらの文字を特に一致させる必要がある場合は、%または_文字の前に置く必要があります。デフォルトでは、エスケープ文字は定義されていません。

LIKEはElasticsearch SQLで検索またはフィルタリングする際の有効なオプションですが、全文検索述語MATCHおよびQUERYより速く、はるかに強力で、好ましい代替手段です

RLIKE

概要:

Sql

  1. expression
  2. RLIKE constant_exp
通常はフィールドまたは定数式
パターン

説明: この演算子はLIKEに似ていますが、ユーザーはパーセント記号(%)やアンダースコア(_)を使用して固定パターンに基づいて文字列を検索することに制限されません。この場合のパターンは正規表現であり、より柔軟なパターンの構築を可能にします。

サポートされている構文については、正規表現構文を参照してください。

Sql

  1. SELECT author, name FROM library WHERE name RLIKE 'Child.* Dune';
  2. author | name
  3. ---------------+----------------
  4. 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')