Tire允许您使用设计用于镜像JSON api的DSL构建elasticsearch查询,例如:
search = Tire::Search::Search.new
search.query do
boolean do
should { match :title, "Red" }
should { match :synopsis, "Red" }
should { match :brand_title, "Red" }
end
boolean do
must { term :excluded, false }
end
end
我想把它分成我自己的DSL来定义可以构建的查询组,有点像Rails范围:
class Proxy
def initialize
@queries = []
end
def results
search = Tire::Search::Search.new
queries = @queries
search.query do
# …? What should go here to search the combined set of conditions?
end
end
def term t
query do
boolean do
should { match :title, t }
should { match :synopsis, t }
should { match :brand_title, t }
end
end
end
def included bool
query do
boolean do
must { term :excluded, !bool }
end
end
end
private
def query &block
@queries << block
end
end
p = Proxy.new
p.term "Red"
p.included true
p.results
问题是,Tire不允许多个search.query
阻止 - 后续query
替换前一个阻止。我可以使用类似instance_eval的东西在查询块的正确上下文中运行多个块吗?
答案 0 :(得分:0)
我不熟悉轮胎,但在elasticsearch Query DSL方面有经验。我认为问题是搜索API只允许JSON中的一个"query": {...}
发送到_search
端点。
以这种方式思考,如果您有多个查询,elasticsearch如何知道如何组合它们。您需要使用另一个bool
查询来执行此操作。
"query"
是(可能很大的)查询树的根,你不能有多个根!
希望我能帮忙......
答案 1 :(得分:0)
文档中对此进行了解释。点击http://karmi.github.io/tire/#section-84。
您可以将其称为
Tire.search('articles') { query { boolean &tags_query } }
然后建立你自己的lambdas。
答案 2 :(得分:0)
事实证明,这些块只能使用instance_eval运行,并且它们在正确的上下文中执行:
def results
search = Tire::Search::Search.new
queries = @queries # Only local variables are available inside the query block below
search.query do
queries.each do |q|
instance_eval(&q)
end
end
end
在我提出这个问题之前,我几乎可以肯定我已经尝试过了,但我想我之前搞砸了。