Elasticsearch ES|QLにおける全文検索機能:MATCHとQSTRの活用

Elasticsearch Query Language (ES|QL) に新たに導入されたテクニカルプレビュー機能である MATCH および QSTR (Query String) 関数は、ログ検索をより直感的かつ効率的にします。MATCH 関数はLuceneのマッチクエリを利用してES|QL内で全文検索を実現し、QSTR 関数はLuceneのクエリ文字列クエリを有効にすることで、より高度なログデータのフィルタリングを可能にします。

ES|QLの全文検索機能は、特に複数の検索語や複雑な条件ロジックを扱う場合に、Kibana Discoverにおける検索操作を簡素化し、パフォーマンスを向上させます。

これらのES|QLの新検索機能は、大幅な性能改善をもたらします。同等の RLIKE クエリと比較して、特に大規模なデータセットでは50倍から1000倍高速なクエリ実行が期待できます。この機能がES|QLに追加されたことで、Elasticの主要な強みの一つである、すべてのデータを事前にインデックス化する能力を最大限に活用できます。これにより、データの投入時に重い処理を一度に行い、後の全文検索を非常に高速に実行することが可能になります。

これらの機能はElasticsearchのDSL関数と緊密に連携し、検索における機能パリティ、直感性、速度が向上します。ES|QLはまた、完全な地理空間検索機能も提供し、距離によるソートのレイテンシーも著しく改善されています。

MATCH 関数

警告:この機能はテクニカルプレビュー段階であり、将来のバージョンで変更または削除される可能性があります。本番環境での使用は避けてください。Elasticは問題の修正に努めますが、テクニカルプレビュー機能は公式GA機能のようなサポートSLAの対象外です。

構文

MATCH(field, query_text)

パラメータ

パラメータ 説明
field クエリのターゲットとなるフィールド。
query_text 指定されたフィールド内で検索するテキスト。

サポートされる型

field query_text 結果
keyword keyword boolean
keyword text boolean
text keyword boolean
text text boolean

使用例

まず、book_catalog という名前のインデックスを作成し、いくつかのドキュメントを投入します。

PUT book_catalog
{
  "mappings": {
    "properties": {
      "item_title": {
        "type": "keyword"
      },
      "primary_author": {
        "type": "text"
      },
      "catalog_id": {
        "type": "long"
      }
    }
  }
}

次に、以下のコマンドを使用してドキュメントを一括でインデックスに書き込みます。

POST book_catalog/_bulk
{"index": {"_id": "1"}}
{"item_title":"Journey to the Stars", "catalog_id": 101, "primary_author": "Anna Miller"}
{"index": {"_id": "2"}}
{"item_title":"The Silent Forest", "catalog_id": 102, "primary_author": "John Smith"}
{"index": {"_id": "3"}}
{"item_title":"Whispers of the Past", "catalog_id": 103, "primary_author": "Sarah Miller"}
{"index": {"_id": "4"}}
{"item_title":"Beyond the Horizon", "catalog_id": 104, "primary_author": "Emily White"}
{"index": {"_id": "5"}}
{"item_title":"The Forgotten Scroll", "catalog_id": 105, "primary_author": "John Smith"}
{"index": {"_id": "6"}}
{"item_title":"Stars Above Us", "catalog_id": 106, "primary_author": "Anna Miller"}

primary_author フィールドに対して「Miller」を検索する例を見てみましょう。

POST _query?format=txt
{
  "query": """
    FROM book_catalog
    | WHERE MATCH(primary_author, "Miller")
    | KEEP catalog_id, primary_author
    | SORT catalog_id ASC
    | LIMIT 5
  """
}

このクエリは以下の結果を返します。

catalog_id | primary_author
-----------+---------------
       101 | Anna Miller
       103 | Sarah Miller
       106 | Anna Miller

検索語の大文字・小文字を「miller」に変更しても、同様に結果が返されることを確認します。

POST _query?format=txt
{
  "query": """
    FROM book_catalog
    | WHERE MATCH(primary_author, "miller")
    | KEEP catalog_id, primary_author
    | LIMIT 5
  """
}

このクエリも、元のクエリと同じ結果を返します。MATCH 関数はデフォルトで大文字・小文字を区別しない全文検索を実行します。

catalog_id | primary_author
-----------+---------------
       101 | Anna Miller
       103 | Sarah Miller
       106 | Anna Miller

次に、「John Smith」というフレーズを検索してみます。

POST _query?format=txt
{
  "query": """
    FROM book_catalog
    | WHERE MATCH(primary_author, "John Smith")
    | KEEP catalog_id, primary_author
    | LIMIT 5
  """
}

期待通り、「John Smith」という著者名を持つドキュメントが返されます。

catalog_id | primary_author
-----------+---------------
       102 | John Smith
       105 | John Smith

item_title フィールド(keyword 型)に対して「Silent」を検索する例を見てみましょう。

POST _query?format=txt
{
  "query": """
    FROM book_catalog
    | WHERE MATCH(item_title, "Silent")
    | KEEP catalog_id, item_title
    | LIMIT 5
  """
}

このクエリは、「The Silent Forest」というタイトルを持つドキュメントを返します。keyword フィールドであっても、MATCH は分析されたコンテンツに対して全文検索的な動作をすることがあります(ただし、ここでは厳密な用語の一致として機能します)。

catalog_id | item_title
-----------+-------------------
       102 | The Silent Forest

ここで、MATCH 関数を使用しない従来の LIKE 演算子と比較してみましょう。primary_author フィールド(text 型)に対して「John」で始まる著者を検索します。

POST _query?format=txt
{
  "query": """
    FROM book_catalog
    | WHERE primary_author LIKE "John *"
    | KEEP catalog_id, primary_author
    | LIMIT 5
  """
}

このクエリは以下を返します。

catalog_id | primary_author
-----------+---------------
       102 | John Smith
       105 | John Smith

一方、大文字・小文字を区別する LIKE 演算子で「john *」と検索すると、結果は返されません。

POST _query?format=txt
{
  "query": """
    FROM book_catalog
    | WHERE primary_author LIKE "john *"
    | KEEP catalog_id, primary_author
    | LIMIT 5
  """
}

これは、LIKE 演算子がデフォルトで大文字・小文字を区別する挙動を示すのに対し、MATCH 関数が全文検索コンテキストで大文字・小文字を区別しないという違いを強調しています。

QSTR 関数

警告:この機能はテクニカルプレビュー段階であり、将来のバージョンで変更または削除される可能性があります。本番環境での使用は避けてください。Elasticは問題の修正に努めますが、テクニカルプレビュー機能は公式GA機能のようなサポートSLAの対象外です。

構文

QSTR(lucene_query_string)

パラメータ

パラメータ 説明
lucene_query_string Luceneのクエリ文字列形式で記述されたクエリ。

説明

Luceneクエリ文字列クエリを実行します。提供されたクエリ文字列に合致する行に対して true を返します。

サポートされる型

query 結果
keyword boolean
text boolean

使用例

primary_author フィールドで「Smith」を検索するLuceneクエリ文字列の例です。

POST _query?format=txt
{
  "query": """
    FROM book_catalog
    | WHERE QSTR("primary_author:Smith")
    | KEEP catalog_id, primary_author
    | LIMIT 5
  """
}

このコマンドは以下の結果を返します。

catalog_id | primary_author
-----------+---------------
       102 | John Smith
       105 | John Smith

さらに、QSTR 関数を使ってより複雑なLuceneクエリを実行してみましょう。例えば、「Miller」または「White」のいずれかの著者を検索する場合です。

POST _query?format=txt
{
  "query": """
    FROM book_catalog
    | WHERE QSTR("primary_author:Miller OR primary_author:White")
    | KEEP catalog_id, primary_author
    | SORT catalog_id ASC
    | LIMIT 5
  """
}

このクエリは以下の結果を返します。

catalog_id | primary_author
-----------+---------------
       101 | Anna Miller
       103 | Sarah Miller
       104 | Emily White
       106 | Anna Miller

このように、QSTR 関数を使用することで、Luceneクエリの持つ強力な表現力をES|QL内で直接活用できます。

タグ: Elasticsearch ES|QL 全文検索 lucene MATCH関数

10月31日 08:32 投稿