【问题标题】:Filter applying to only one model with Tire and ElasticSearch in Rails过滤器仅适用于 Rails 中的轮胎和 ElasticSearch 的一个模型
【发布时间】:2012-05-03 07:59:31
【问题描述】:

我有几个用 elasticsearch 索引的模型,其中一个有一个需要过滤的关联,但是如果我在 search 方法中添加这样的东西

  search.filter :range, 'sessions.starts_on' => {:gte => start_date,
                                                 :lte => ends_on}

然后所有模型都被过滤掉,因为它们没有sessions这样的关联。

那么有没有办法只对一个模型应用过滤器?

非常感谢任何想法!

【问题讨论】:

  • 您在使用 AciveRecord 吗?您是否考虑过为此自定义 to_json 索引方法?
  • 对于 ActiveRecord 是。和自定义索引 - 究竟如何?让这些“sessions.starts_on”返回什么?

标签: ruby-on-rails ruby elasticsearch tire


【解决方案1】:

为与该模型特别相关的轮胎索引创建一个模块并将其包含在模型中。由于会话仅与模型相关联,因此它的参考将在将用于弹性搜索的文档中。您必须像这样在模型文档中合并会话文档,因为我们将文档的 json 传递给轮胎索引模块中的 elasticsearch

def to_model_json
    self.document.merge({"sessions" => sessions.as_json}).to_json
end

此方法通过轮胎将 json 中的文档传递给 elasticsearch,这将把它们的会话合并到文档中。

在轮胎索引模块中给出一个索引名称,您可以将其传递给轮胎搜索对象以运行过滤器查询

现在创建一个轮胎搜索对象

search_object = Tire::Search::Search::new(Model.index_name, other attributes)

你可以检查你可以从https://github.com/karmi/tire传递的其他属性

然后像这样运行您的搜索方法,它将给出所需的结果

 search_object.filter :range, 'sessions.starts_on' => {:gte => start_date,
                                                  :lte => ends_on}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2013-07-21
    • 2012-12-24
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多