2012-06-25 222 views
0

UPDATE:重新定義了我正在嘗試執行的操作。彈性搜索中的獨立索引

我有一個聯繫人的模型,這個聯繫人屬於一個帳戶,就像我帳戶中的每個其他模型一樣。我需要所有搜索,無論它們是全局還是模型特定的,只查詢包含的帳戶。我被告知可以使用自定義索引名稱執行此操作。我希望索引名稱是'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 
+0

在ES中定義'contact'有一個字段'firmid'並對其進行過濾?否則,我不知道你問的是 –

+0

更新更好嗎? –

回答

0

您是否指每個帳戶(用戶?)在其各自的索引中物理分離?這通常被稱爲「多租戶」 http://en.wikipedia.org/wiki/Multitenancy

假設這確實是自己爲自己設定的事:

很多人在對「需要」過去有人說(我假設你想這對安全的原因,我不熟悉爲什麼你會想要這樣做的其他原因,雖然我不是多租戶應用程序的專家)分區每個帳戶/用戶的數據,因爲有一個字段accountidContact並確保您的所有查詢都至少在accountid上過濾。海事組織是一個精心設計的查詢組件,比如說系統中使用的每個查詢都繼承了設置accountid所需的「超級查詢」,這在很多情況下就足夠了。

即使您不知道未來哪些應用程序將要查詢這些索引,您仍然可以通過在ES周圍使用瘦REST服務並要求所有程序通過ES與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。一般來說,你應該保持你的域模型不受任何關於存儲後端的知識(包括存儲數據的索引)的影響

對我而言,更好的解決方案是,如前所述,組件,其中包含基於賬戶/用戶選擇正確索引的邏輯。按照上面的休息服務方法,正如你所建議的那樣,動態索引名可以從登錄的用戶那裏獲得。

我意識到這可能不是你的問題的直接答案,但我希望它仍然有用。

+0

這是一個很好的答案。我可以用est接口直接構建它。然而,我使用'輪胎'寶石與ES溝通。我希望有一些直接的方式來做到這一點與寶石。 –

1

您可能需要檢查comment at Tire's issues,它基本上涵蓋了使用Tire進行「tenant-based」索引命名的一些可能場景。我相信這是你的追求。

在elasticsearch本身中,您可以選擇爲每個帳戶分別設置一個索引,爲每個帳戶,索引模板等過濾&路由索引別名,因此該工具包在這方面很多。