2016-07-14 83 views
1

,看起来像这样给出的数据:如何在文档字段MongoDB中找到相似性?

{'_id': 'foobar1', 
'about': 'similarity in comparison', 
'categories': ['one', 'two', 'three']} 
{'_id': 'foobar2', 
'about': 'perfect similarity in comparison', 
'categories': ['one']} 
{'_id': 'foobar3', 
'about': 'partial similarity', 
'categories': ['one', 'two']} 
{'_id': 'foobar4', 
'about': 'none', 
'categories': ['one', 'two']} 

我想找到一种方式来获得一个项目,所有其它项目之间的相似性集合中,然后在最相似的顺序返回。相似性是基于共同的字数,已经有一个功能int similar(String one, String two)

例如:如果我想为foobar1about领域的类似度列表,它会返回

[{'_id': 'foobar2'}, {'_id': 'foobar3'}, {'_id': 'foobar4'}]

我做这与morphia,但只有mongoDB实现,我可以计算其余的出

回答

1

如果您需要计算about字段上的文本相似性,一种方法是使用text index

例如(在mongo壳),如果您创建的about领域的文本索引:

db.collection.createIndex({about: 'text'}) 

,你可以执行查询,如(从https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score采取为例):

db.collection.find({$text: {$search: 'similarity in comparison'}}, {score: {$meta: 'textScore'}}).sort({score: {$meta: 'textScore'}}) 

用您的示例文档,查询应该返回类似于:

{ 
    "_id": "foobar1", 
    "about": "similarity in comparison", 
    "score": 1.5 
} 
{ 
    "_id": "foobar2", 
    "about": "perfect similarity in comparison", 
    "score": 1.3333333333333333 
} 
{ 
    "_id": "foobar3", 
    "about": "partial similarity", 
    "score": 0.75 
} 

这是通过减少相似性得分排序。请注意,与您的示例结果不同,文档foobar4未返回,因为foobar4中没有查询字词。

文本索引在MongoDB中被认为是一种特殊的索引类型,因此在其使用方面有一些特定的规则。有关详细信息,请参阅:

相关问题