弹性搜索中的独立索引

时间:2012-06-25 12:58:15

标签: ruby-on-rails-3 elasticsearch tire

更新:重新定义我要做的事情。

我有联系模式,此联系人属于一个帐户,我帐户中的其他模型也是如此。我需要所有搜索,无论它们是全局的还是特定于模型的,只能查询包含的帐户。我被告知我可以使用自定义索引名称来执行此操作。我希望索引名称为'index - #{account-id}'。我如何在我的活动模型中实现这一目标?

class Contact < ActiveRecord::Base
  include Tire::Model::Search
  include Tire::Model::Callbacks

  belongs_to :account

  mapping do
    indexes :first_name
    indexed :last_name
  end    

end

class Account < ActiveRecord::Base
    has_many :contacts
end

2 个答案:

答案 0 :(得分:1)

您可能需要查看此comment at Tire's issues,其中基本上介绍了使用Tire命名“基于租户”索引的一些可能方案。我相信这就是你所追求的目标。

在elasticsearch本身,您可以选择为每个帐户设置单独的索引,过滤后的&amp;每个帐户,索引模板等的路由索引别名,因此该工具包在这个领域非常广泛。

答案 1 :(得分:0)

您是指每个帐户(用户?)在每个帐户的每个索引中实际分开吗?这通常被称为“多租户”http://en.wikipedia.org/wiki/Multitenancy

假设这确实是你打算做的事情:

过去有很多关于'需求'的说法(我假设你出于安全原因想要这个,我不熟悉你想要这个的其他原因,虽然我不是多租户应用的专家)用于为每个帐户/用户分区数据,例如,仅为accountid设置一个字段Contact,并确保所有查询至少在accountid上过滤。 IMO,一个精心设计的查询组件,例如,系统中使用的每个查询都继承自设置accountid所需的“超级查询”,在很多情况下就足够了。

即使您不知道将来哪些应用程序想要查询这些索引,您仍然可以强制执行上述操作,例如,在ES周围使用瘦REST服务并要求所有程序通过此与ES进行交互服务。然后,您可以通过强制执行accountid来处理此类安全性,或者更好的方法是通过当前登录用户执行请求来推断accountid

如果您仍想追求多租户,请查看:http://elasticsearch-users.115913.n3.nabble.com/Multi-tenacy-td471400.html(快速搜索此内容,或许有更好的内容)'Kimchy'(ES的创建者)也在该主题中发表评论。

无论如何,ES拥有多租户的最佳方式可能是每个帐户/用户拥有1个索引。在其中你可以有多个'类型'(ES构造),其中Contact可以是这样的类型。

http://www.elasticsearch.org/guide/reference/mapping/ http://www.elasticsearch.org/guide/reference/api/search/indices-types.html

正如您所建议的那样,在您的模型中执行此操作可能不是IMO的正确方法。通常,您应该保持域模型不受存储后端的任何知识(包括存储数据的索引)的保护。

对我来说,更好的解决方案是,如前所述,拥有一个查询组件,其中将包含基于帐户/用户选择正确索引的逻辑。使用上面的rest-service方法,您建议的动态索引名可以从执行请求的登录用户派生。

我意识到这可能不是你问题的直接答案,但我希望它仍然有用。