🔍
Elasticsearch DSLにおけるinstance_evalの使用とクエリ備忘録
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