过滤仅适用于Rails中使用Tire和ElasticSearch的一个模型

alo*_*ony 5 ruby ruby-on-rails elasticsearch tire

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

  search.filter :range, 'sessions.starts_on' => {:gte => start_date,
                                                 :lte => ends_on}
Run Code Online (Sandbox Code Playgroud)

然后过滤掉所有模型,因为它们没有这种关联sessions.

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

任何想法都非常感谢!

abh*_*has 1

创建一个专门与该模型相关的轮胎索引模块,并将其包含在模型中。由于会话仅与模型关联,因此其参考将存在于将要发送到 Elasticsearch 的文档中。您必须像这样将会话文档合并到模型文档中,因为我们将文档的 json 传递给轮胎索引模块中的 Elasticsearch

def to_model_json
    self.document.merge({"sessions" => sessions.as_json}).to_json
end
Run Code Online (Sandbox Code Playgroud)

该方法通过tire将json格式的文档传递给elasticsearch,后者会将它们的会话合并到文档中。

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

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

search_object = Tire::Search::Search::new(Model.index_name, other attributes)
Run Code Online (Sandbox Code Playgroud)

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

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

 search_object.filter :range, 'sessions.starts_on' => {:gte => start_date,
                                                  :lte => ends_on}
Run Code Online (Sandbox Code Playgroud)