# Elasticsearchの機能と実践的な使い方
🧩 「キーワード + たくさんの絞り込み」を1つのJSONで表現する——Query DSLとその`bool`クエリは、検索バックエンドのデファクトです。filter句の使い分けが性能を左右します。
🏷️ タイトル: Query DSL(JSON クエリ言語)
🔗 URL:
📘 概要
Query DSLは、`_search` APIを通じて使うJSON形式のクエリ言語です。検索・フィルタ・集計を表現でき、クエリは互いに連結した節(clause)の抽象構文木として組み立てられます。検索バックエンド実装の事実上の標準です。
⚙️ 機能の説明
理解の鍵は2つの分類です。
・節の種類:単独で動く「リーフクエリ」(`match`/`term`/`range`など)と、それらを束ねる「複合クエリ」(`bool`/`dis_max`など)。
・コンテキスト:クエリコンテキストは「どれだけ一致するか」を問い、`_score`を計算します。フィルタコンテキストは「一致するか否か」のYes/Noのみで、スコア計算をせず高速・自動キャッシュされます。
中心となる`bool`クエリの4節は、`must`(一致必須・スコアあり)、`should`(任意・スコア加点、`minimum_should_match`で制御)、`filter`(一致必須・スコアなし・キャッシュ)、`must_not`(除外・フィルタコンテキスト)です。
🛠️ 実践的な使い方
求人検索のように、キーワード検索を`must`に、絞り込みを`filter`に置く構成です。
```
{ "query": { "bool": {
"must": [ { "multi_match": {
"query": "バックエンド エンジニア",
"fields": ["title", "description"] } } ],
"filter": [
{ "term": { "location": "tokyo" } },
{ "terms": { "employment_type": ["fulltime", "contract"] } },
{ "range": { "salary": { "gte": 5000000 } } } ] } } }
```
キーワードはスコアに効かせたいので`must`、勤務地・雇用形態・年収はスコア不要なので`filter`に置きます。`filter`句はキャッシュされ繰り返し実行が速くなります。
💡 ユースケース
ECや求人・不動産など「全文検索 + 構造化された多数の絞り込み」を持つ検索アプリ全般に当てはまります。スコアで並べたい条件と、単に該当/非該当で絞りたい条件を`must`と`filter`に振り分けることで、関連度ランキングと厳密な絞り込みを両立できます。
⚠️ 注意点
最大の落とし穴は`term`と`match`の取り違えです。`term`は解析せず完全一致するため、解析済みの`text`フィールドに使うと0件になりがちです。`text`には`match`、`keyword`やステータス・日付などの構造化フィールドには`term`を使います。スコア不要の条件は必ず`filter`に置き、キャッシュとCPU削減の恩恵を受けましょう。
#
Elasticsearch# #
QueryDSL#