2016-07-14 84 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中被認爲是一種特殊的索引類型,因此在其使用方面有一些特定的規則。有關詳細信息,請參閱:

相關問題