Elasticsearch Query DSLの習得:データ取得のための必須コマンド
Elasticsearchはその巨大な量の非構造化データおよび構造化データを扱う際の速度と柔軟性で有名です。その検索能力の中心にあるのが、クエリ固有言語(Query Domain Specific Language、DSL)です。これは、Search APIを通じて洗練された検索リクエストを定義するために使用される、強力なJSONベースの言語です。単なるキーワード検索を超えて、正確で、フィルタリングされ、集計されたデータ取得を実行するためには、Query DSLの理解が不可欠です。
本ガイドでは、Elasticsearch Query DSLの基本的な構成要素を順を追って説明します。コアなクエリタイプを探り、それらをboolクエリを使用して複雑なロジックのために結合する方法を実演し、インデックスから効率的なデータ取得を習得するための実践的な例を提供します。
Elasticsearch検索リクエストの構造
すべてのElasticsearch検索は、特定のインデックス(または複数インデックス)の_searchエンドポイントに対して実行されます。基本的な検索リクエストは、クエリパラメータを定義するJSONボディを含むPOSTリクエストです。このボディの中で最も重要な部分がqueryオブジェクトです。
基本構造:
POST /your_index_name/_search
{
"query": { ... ここにクエリ構造を定義 ... },
"size": 10,
"from": 0
}
コアクエリタイプ:精度と関連性
Query DSLは、さまざまなデータ型とマッチングのニーズに合わせて調整された幅広いクエリを提供します。クエリの選択は、関連性スコアリングとパフォーマンスの両方に大きく影響します。
1.全文検索:matchクエリ
The matchクエリは、分析されたフィールド全体での全文検索の標準です。これは検索語をトークン化し、指定されたフィールド内のマッチするトークンをチェックします。
ユースケース: 関連性スコアリングが重要な自然言語テキストの検索。
例: 'cloud' または 'computing' という単語を含む'description'フィールドを持つドキュメントを検索する。
GET /products/_search
{
"query": {
"match": {
"description": "cloud computing"
}
}
}
2.完全一致検索:termクエリ
The termクエリは、指定された完全なタームを含むドキュメントを検索します。matchとは異なり、検索文字列に対して分析を実行しないため、キーワード、ID、または数値インデックス付けされたフィールドでの完全一致に最適です。
ユースケース: 分析されていないフィールド(keywordフィールドや数値など)での正確な値によるフィルタリング。
例: 正確なID SKU10021 を持つ製品を取得する。
GET /products/_search
{
"query": {
"term": {
"product_id": "SKU10021"
}
}
}
3.範囲クエリ
範囲クエリを使用すると、フィールドの値が指定された範囲内(数値、日付、または文字列)にあるドキュメントをフィルタリングできます。
構文: gt (greater than/より大きい)、gte (greater than or equal to/以上)、lt (less than/より小さい)、lte (less than or equal to/以下)を使用します。
例: 2024年1月1日以降に行われた注文を検索する。
GET /orders/_search
{
"query": {
"range": {
"order_date": {
"gte": "2024-01-01",
"lt": "2025-01-01"
}
}
}
}
4.存在によるフィルタリング:existsクエリ
The existsクエリは、特定のフィールドが存在する(つまり、nullまたは欠落していない)ドキュメントを識別します。
例: Eメールアドレスを提供したすべてのユーザーを検索する。
GET /users/_search
{
"query": {
"exists": {
"field": "email_address"
}
}
}
boolクエリを使用した複雑なロジックの構築
事実上すべての実世界の検索アプリケーションでは、複数の条件を組み合わせる必要があります。boolクエリは、ブール論理を使用して他のクエリ句を組み合わせることを可能にする、このための不可欠なツールです。
bool内の句
The boolクエリは4つの主要な句を受け入れます。
must: この配列内のすべての句は一致しなければなりません。must内の句は関連性スコアに寄与します。filter: この配列内のすべての句は一致しなければなりませんが、スコアリングを行わないコンテキストで実行されます。これにより、厳密な包含/除外基準に対して非常に高速になります。should: この配列内の少なくとも1つの句が一致すべきです。これらの句は関連性スコアに影響を与えますが、マッチングについてはオプションです。must_not: この配列内のどの句も一致してはなりません(論理的なNOTに相当します)。
実用的なboolクエリの例
いくつかの概念を組み合わせて、「security」という単語に言及し、かつドラフトを除外し、'US'リージョンで利用可能な高優先度のドキュメントを検索してみましょう。
GET /logs/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"content": "security breach"
}
}
],
"filter": [
{
"term": {
"region.keyword": "US"
}
}
],
"should": [
{
"term": {
"priority": 5
}
}
],
"must_not": [
{
"term": {
"status.keyword": "DRAFT"
}
}
]
}
}
}
例の説明:
- Must: ドキュメントは、分析されたcontentフィールドに「security breach」というフレーズを含まなければなりません。
- Filter: ドキュメントは「US」リージョンとしてタグ付けされていなければなりません(高速な完全一致)。
- Should:
priority: 5にマッチするドキュメントは関連性スコアでブーストされますが、must句とfilter句を満たす優先度が低いドキュメントも返されます。 - Must Not: 「DRAFT」としてマークされたドキュメントは厳密に除外されます。
クエリ構築のベストプラクティス
検索が正確かつ高性能であることを保証するために、次のガイドラインに従ってください。
- 非スコアリング基準には
mustよりもfilterを優先する。 ID、正確な日付、またはステータスによるフィルタリングなど、包含/除外をチェックするだけの場合は、boolクエリ内で必ずfilter句を使用してください。これによりキャッシングが活用され、コストの高いスコーリング計算が回避されます。 - 完全一致クエリを賢く使用する:
text(分析済み)としてマッピングされたフィールドにはmatchを使用し、keyword(非分析済み)としてマッピングされたフィールドにはtermまたは範囲クエリを使用します。 - 深いネストを避ける: 可能ではありますが、深くネストされた
boolクエリは読解やデバッグが困難になり、時にはパフォーマンスの低下につながる可能性があります。 minimum_should_matchを活用する:should句の場合、minimum_should_match(例:1または2)を設定すると、それらのオプションの基準が一定数満たされることが強制され、実質的に必須基準に変わりつつ、スコアリングへの寄与も可能になります。
Query DSLを習得するとは、文脈が重要な場合はmatchの分析能力を使用し、正確さが要求される場合はtermやfilterの精度と速度を使用するなど、適切なツールを適切なジョブにマッチさせることを学ぶことです。これらの基本的なクエリタイプを適用し、boolクエリの組み合わせ能力を活用することで、Elasticsearchで非常に効果的かつ効率的なデータ取得戦略を構築できます。