2013-12-10 93 views
0

我們有如下設置(簡體/更改):從多個列表搜索與elasticsearch

MongoDB的集合: 文章

Redis的列表: 今天 昨天 這 本週月

我們經常收到新的文章,並將它們放在適當的列表中(一篇新文章將進入'今天​​''本週'和'本月'[redis列表包含id到mongodb集合])。

這些列表可以包含很多項目('本月'達到數百萬)。 這些列表經常變化,文章消失並重新出現(業務邏輯)。

這些列表必須是可搜索的(+ beyonce -rihanna,如果你想閱讀關於碧昂斯的新聞,但不是關於蕾哈娜)。我們的第一個實現(當列表很小時)是簡單地索引Elastic中的整個Articles集合,並在搜索特定的列表時,我們使用關鍵字(+ beyonce -rihanna)和包含在列表中的所有id來查詢彈性。這工作了幾千條,但正如預期的那樣,它不能很好地擴展。

目前,我們已經想到的2種方法來處理這個問題:

  • 當索引一個新的第(彈性),我們引用的所有名單 它是那麼查詢特定列表物品時。我們的查詢 包含關鍵字(+ beyonce -rihanna)和我們從(昨天)查詢 的列表。
  • 在Elastic中創建多個索引(每個redis列表1個)。查詢文章時,我們只需指定索引和關鍵字。

以上兩種方式都適合嗎?或者我們應該以不同的方式處理這個案子

回答

0

無論哪種方式都是一個很好的解決方案,IMO。您需要選擇最適合您的業務需求並且可以爲您的組織維護的那一個。如果可以選擇,我寧願引用的文章是在一個單一的指數相關,原因如下列表中的第一個選項:

  • 當物品清單(今天,昨天,這個星期之間移動,本月),你只需要更新列表引用。通過第二種方法,您需要管理刪除並將文章添加到適當的索引。
  • 如果有一個用例在同一時間(例如今天和昨天)跨多個列表進行搜索,那麼如果文章位於不同的索引中,則將失去排名,排序和聚合功能。您需要對單獨的索引執行單個搜索,然後對結果進行排序,排序和聚合。

如果您決定使用單個索引的第一個選項,我會建議使用已過濾的Index Aliases來管理針對不同列表的查詢。使用這種方法,您可以創建單個索引,然後使用今天,昨天,this_week和this_month命名的別名,這些別名將根據該列表名稱自動篩選文章。當您需要根據多個列表進行篩選時,您總是可以使用主索引進行搜索。