如何在文档字段MongoDB中找到相似性?

时间:2016-07-14 04:19:15

标签: mongodb sorting mongodb-query

给出如下数据:

{'_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实现,我可以想出其余部分

1 个答案:

答案 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中被认为是一种特殊类型的索引,因此它的使用带有一些特定的规则。有关详细信息,请参阅: