Tire gem的搜索方法有哪些参数?

时间:2014-06-17 12:56:22

标签: ruby-on-rails ruby elasticsearch tire

我需要使用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之前我只是错过了关键字。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

您可能只需要这样做:

Program.tire.search({load: true, size: 50}.merge(search))

修改

实际上,查看searchhttps://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的值。