2013-04-03 42 views
2

假設我有以下結構MongoDB的最佳陣列匹配

[{  
    name: 'John',  
    tags: ['unix','databases']  
},  
{  
    name: 'Jane',  
    tags: ['excel', 'power-point','word', 'outlook'] 
}, 
{ 
    name: 'Smith', 
    tags: ['databases', 'linux', 'android'] 
}] 

,我要尋找的人['databases','servers','c++']

我想要一個查詢,這將給我的兩個最好的比賽是史密斯和約翰每場比賽一場。

這種感覺類似於具有兩個術語向量,並找到餘弦產物http://en.wikipedia.org/wiki/Vector_space_model

P.S.
我意識到我可能可以做一個$的,然後計算在我的程序(用Java編寫的)類似的術語數量,但有一種方式來獲得從蒙戈本身

回答

1

我想,你爲什麼不使用答案map-reduce。在新集合中創建標籤的反轉索引並將標識存儲在標籤中。那麼你可以計算所有標籤的匹配,然後按最大匹配排序。請點擊此處查看博客:http://ngsiolei.blogspot.com/2010/11/basic-inverted-index-in-mongodb.html。即使它看起來像更多的文本搜索,但你也可以使用相同的。即使在將來,這種方法也會使您靈活地爲您的標籤添加一些重量,以獲得更好的結果。集合看起來像這樣。所以當我爲數據庫搜索C++時,我會在兩者中得到James,並且我將總結它2和J將得到1,因此James更匹配。通過這種方式,我們將爲每個標籤創建一個文檔,這將是Id,因此您的搜索將更快。如果你想要一些簡單的方法使用聚合框架(http://docs.mongodb.org/manual/applications/aggregation/),並使用上放鬆標籤欄

  C++ : ["James" , "J" ] , Database : ["James"] 
+0

告訴我,如果我得到這個權利。 我使用as:tag:「」名稱:[<數組名稱>]創建集合,然後獲取我想要的所有標籤的名稱,然後找到最佳匹配項? –

+0

更新了我的答案,請看看 – Devesh

+0

明白了,但我的問題是後來的處理。一旦我有所有名稱的數組,我需要以編程方式計算大多數事件的權利?一個比較常見的標籤示例:「Windows」將返回數千個名字 –