2013-03-25 22 views
1

參考這裏this問題很多指標:MongoDB的細化搜索

我正在使用的MongoDB作爲我的主要數據庫的類似網站。正如你可以想象的,每個用戶對象都有很多需要可以被接受的字段,例如情緒,城市,年齡,性別,吸菸者,飲酒者等。

現在,除了不能存在的問題每個集合超過64個索引,將索引分配給所有字段是否明智?

可能還有另一種可行的方法:標籤(參考this other問題)如果我在預定標籤的數組上設置索引,然後對它們進行文本搜索,會更好嗎?因爲我只使用了一個索引。你怎麼看?例如:

{ 
    name: "john", 
    tags: ["happy", "new-york", "smoke0", "drink1"] 
} 

回答

2

MongoDB doesn't (yet) support index intersection,所以規則是:每個查詢一個索引。一些查詢參數的選擇性極低,極端的例子是布爾型的,索引這些參數通常會減慢速度,而不是加快速度。

作爲一個簡單的近似值,您可以創建一個以最高選擇性字段開始的複合索引,例如{「city」,「age」,「mood」,...}。然而,那麼你將永遠不得不使用城市約束。如果您查詢{age,mood},則不會使用上述索引。

如果您可以使用索引將結果集合縮小到合理的大小,那麼該集合內的掃描不會是性能問題。更準確地說,如果你說limit(100)和MongoDB必須掃描200個項目來填充這100個項目,那麼它並不重要。

危險之處在於數據庫中的搜索範圍非常狹窄 - 如果您必須對整個數據集執行掃描才能找到唯一一個不滿95歲的非吸菸者,那麼事情會變得很難看。

如果你想允許非常細粒度的搜索,像SolR這樣的專用搜索數據庫可能是更好的選擇。

編輯:tags建議看起來有點像使用撬棍給我 - 也許在MongoDB的FAQ建議key/value multikey index是一個清潔的解決方案:

{ _id : ObjectId(...), 
    attrib : [ 
      { k: "mood", v: "happy" }, 
      { k: "city": v: "new york" }, 
      { k: "smoker": v: false }, 
      { k: "drinker": v: true } 
      ] 
} 

然而,因人而異地和「無污染」和「快速「通常不會指向相同的方向,因此這種方法可能並不糟糕。

+0

解決方案與mongodb一起工作嗎?另請參閱編輯:) – 2013-03-25 16:59:30

+1

SolR是一個單獨的數據庫,但可以在SolR中搜索用戶ID列表並將實際數據存儲在MongoDB中。首先,實際數據庫中的數據不能在搜索索引可以重新創建時使用。此外,搜索索引可能需要重新構建,儘管如果您的搜索關閉或不完整,它可能並不酷,但如果您的主數據庫關閉,通常情況會更糟糕。 – mnemosyn 2013-03-25 17:02:38

+0

檢查我所做的編輯...對你有意義嗎? – 2013-03-25 17:06:30