🔍

Elasticsearch DSLにおけるinstance_evalの使用とクエリ備忘録

2024/06/06に公開

instance_evalとは何か?

作成したインスタンのコンテキスト内でブロックを評価し、そのインスタンスのインスタンスメソッドやインスタンス変数にアクセスできるようにする評価メソッド。

具体的なElasticsearch DSLの例

Elasticsearch DSLは、複雑な検索クエリを簡潔に記述するためのメソッドチェーンとブロック(do ... end)を多用しています。以下に、具体的なクエリ構築の例とその動作の説明を示します。

Elasticsearchモジュール

module Elasticsearch
  module DSL
    module Search
      class Search
        def initialize
          @query = {}
        end

        def query(&block)
          @query[:query] ||= {}
          instance_eval(&block) if block_given?
        end

        def bool(&block)
          @query[:query][:bool] ||= {}
          instance_eval(&block) if block_given?
        end

        def should(&block)
          @query[:query][:bool][:should] ||= []
          instance_eval(&block) if block_given?
        end

        # 省略...

        def match(field, value)
          @query[:query][:bool][:must] << { match: { field => value } }
        end
      end
    end
  end
end

クエリ構築の例

definition = Elasticsearch::DSL::Search::Search.new

definition.query do
  bool do
    should do
      match :title, 'aaaaa'
    end
    should do
      match :title, 'bbbbb'
    end
  end
end

生成されるクエリ

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "title": "aaaaa"
          }
        },
        {
          "match": {
            "title": "bbbbb"
          }
        }
      ]
    }
  }
}

Discussion