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

sic*_*ter 5 sorting mongodb 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']}
Run Code Online (Sandbox Code Playgroud)

我想找到一种方法来获取单个项目与集合中所有其他项目之间的相似性,然后按相似性最高的顺序返回它们。相似度是基于共同的词数,已经有一个功能int similar(String one, String two)

例如:如果我想要的about字段的相似性列表foobar1,它将返回

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

我使用吗啡来做到这一点,但是仅通过mongoDB实现,我就可以弄清楚其余部分

kev*_*adi 8

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

例如(在mongoshell中),如果您在about字段上创建文本索引:

db.collection.createIndex({about: 'text'})
Run Code Online (Sandbox Code Playgroud)

您可以执行以下查询(例如,取自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'}})
Run Code Online (Sandbox Code Playgroud)

对于示例文档,查询应返回以下内容:

{
  "_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
}
Run Code Online (Sandbox Code Playgroud)

通过减少相似性得分对它们进行排序。请注意,与示例结果不同,foobar4不会返回文档,因为中没有任何查询的单词foobar4

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

  • 如果关于数据包含较大的文本,可以使用此功能吗?例如一篇新闻文章可能很长? (2认同)
  • 是的,文本索引旨在处理文本块。 (2认同)