2014-04-03 294 views
0

我們正在構建一個消息系統,其中消息分佈在多個列表之間。我們當前的實現是建立在Redis的,看起來是這樣的:elasticsearch上的消息系統

Message comes in from user 「peeter」 
Message is added to list 「user:peeter:messages」 
Since peeter is in the group 「developers」 the message is also added to 「group:developer:messages」 list 
Since the group developers belongs to a watchlist (a group of groups) called 「it」, the message is also added to "watchlist:it:messages" list 

現在我們有一個新的要求,列出需要連接到它們的過濾器。因此,組「開發人員」將有一個過濾器「+ php -javascript」,以僅顯示來自該組中與該過濾器匹配的用戶的消息。

我們考慮將整個事情轉移到elasticsearch。因此,我們將我們的指數在以下格式的消息:

{ 
    message : "PHP is awesome and Javascript is awesome and Java is awesome", 
    user : "peeter", 
    groups : ["developers", "architects"], 
    watchlists : ["it", "tech personel", "weekend workers", "emergency staff"] 
} 

當我們尋找了「開發者」組中,我們會在下面的格式查詢彈性:

{ 
    query_string : "+php -javascript", 
    term : { 
     "groups" : "developers" 
    } 
} 

的問題是這些列表經常變化。新用戶被添加到「開發人員」組中,並將新組添加到監視列表中。您也可以將2個組合並在一起,因此「開發人員」和「架構師」成爲名爲「dev-architects」的單個組。我們將留下一個不斷更新而又大量閱讀的索引。

我們有第二個想法是指數按以下格式文件:

{ 
    message : "PHP is awesome and Javascript is awesome and Java is awesome", 
    user : "peeter" 
} 

當我們尋找了「開發者」組中,我們會在下面的格式查詢彈性:

{ 
    query_string : "+php -javascript", 
    term : { 
     "user" : "peeter", "michael", "jamie" 
    } 
} 

這種方法的問題是,組「開發人員」中可能有多達2000個用戶。

這些解決方案中的任何一個是否有效?

+0

不會logstash(http://logstash.net/docs/1.4.0/tutorials/getting-started-with-logstash),建立在ES的頂部(並且因爲幾個月的一部分)ES已經提供了大部分/所有你需要的東西? –

+0

這不適用於日誌文件管理。 – Peeter

+0

是的,我意識到,但不是概念上類似的日誌條目和事件消息?無論如何,第二,雖然我不認爲這是一個很好的組合,因爲你需要'觀察列表'的概念。 –

回答

0

改善與屬於「開發者」組的用戶列表中查詢性能的一種方式,可以使用術語查找機制 - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-terms-filter.html#_terms_lookup_mechanism

所以,你可以有一個單獨的索引(或類型),含每個組的文件。在該文檔中,您持有屬於該組的用戶列表。而且你指出你的術語查詢可以使術語與該文件相匹配。

可能與您的關注清單條款相同。