2

假设我有以下结构

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

我想搜索以下人员['databases','servers','c++']

我想要一个查询,它会告诉我两个最佳匹配是 Smith 和 John,每个匹配一个。

这感觉类似于拥有两个术语向量并找到余弦积 http://en.wikipedia.org/wiki/Vector_space_model

PS
我意识到我可能可以做一个 $in 然后计算我的程序中类似术语的数量(用Java编写),但是有没有办法从mongo本身得到答案

4

1 回答 1

1

我想你为什么不使用map-reduce。在新集合中创建标签的倒排索引,并将 ID 存储在 Tags 中。然后您可以计算所有标签的匹配项,然后按最大匹配项排序显示。在此处查看博客之一:http: //ngsiolei.blogspot.com/2010/11/basic-inverted-index-in-mongodb.html. 尽管它看起来像更多的文本搜索,但您也可以使用相同的搜索。即使在将来,这种方法也会让您灵活地为标签添加一些权重年龄以获得更好的结果。集合将如下所示。因此,当我为 Database both 搜索 C++ 时,我会在两者中都得到 James,我会将其相加 2 并且 J 将得到 1 ,所以 James 匹配得更多。这样,我们将为每个标签创建一个文档,它将是 Id ,因此您的搜索会更快。如果您想要一些简单的方法,请使用聚合框架(http://docs.mongodb.org/manual/applications/aggregation/)并使用标签列上的展开

         C++ : ["James" , "J" ] , Database : ["James"] 
于 2013-04-03T06:43:37.023 回答