给出如下数据:
{'_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)
例如:如果我想要about
的{{1}}字段的相似性列表,则会返回
foobar1
我正在使用morphia这样做,但只有mongoDB实现,我可以想出其余部分
答案 0 :(得分:5)
如果您需要在about
字段上计算文字相似度,实现此目的的一种方法是使用text index。
例如(在mongo
shell中),如果您在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中被认为是一种特殊类型的索引,因此它的使用带有一些特定的规则。有关详细信息,请参阅: