5

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

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

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

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

任何想法都非常感谢!

4

1 回答 1

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}
于 2012-05-11T08:26:48.813 回答