我需要使用Tire运行搜索,我的查询专门定义为参数,但我不确定如何继续。
search = {
query: {
function_score: {
query: { match_all: {} },
# filters is an array previously built
functions: filters,
score_mode: "total"
}
}
}
Program.tire.search(load: true, size: 50, search)
我收到以下错误:/Users/app/models/program_match.rb:122: syntax error, unexpected ')', expecting tASSOC
这让我相信在致电search
之前我只是错过了关键字。
非常感谢任何帮助!
答案 0 :(得分:3)
您可能只需要这样做:
Program.tire.search({load: true, size: 50}.merge(search))
修改强>
实际上,查看search
(https://github.com/karmi/retire/blob/master/lib/tire/model/search.rb)的来源,看起来你需要这样做:
Program.tire.search(search, {load: true, size: 50})
search
需要两个参数(查询,选项)或一个参数(用于选项)和一个块(用于查询)。 Ruby感到困惑,因为你已经开始一个哈希(load: true ...
),然后只是添加一个新的哈希(你的search
哈希),它看作是一个哈希键(没有值)。
另外,如果你刚开始使用Tire,我会建议你查看elasticsearch-rails,据作者说,它正在取代Tyre。
我最近将一个Tire项目转换为elasticsearch-rails,并且发现它可以完成Tire所做的一切,虽然它不提供查询DSL(看起来你似乎没有使用它,所以没有损失)
编辑2
您可以执行简单的match_all
查询,例如:
Program.tire.search(load: true, size: 50) { query { all } }
你可以通过以下方式获得类似的东西:
Program.tire.search('*', load: true, size: 50)
正如我在下面的评论中所述,作为search
的第一个参数的查询将始终包含在query_string
查询中。
最初做出最初要求的方法可能是:
Tire.search(Video.tire.index_name, query: {
function_score: {
query: { match_all: {} },
functions: filters,
score_mode: "total"
}
}).results
我刚刚在本地项目上测试了类似的function_score
查询,并确认它产生了预期的查询。
编辑3
我以前从未使用load
选项,但看起来你可以这样做:
Tire.search(Video.tire.index_name, payload: {
query: {
function_score: {
query: { match_all: {} },
functions: filters,
score_mode: "total"
}
}
}, load: true).results
请注意,您必须将查询包装为payload
的值。