2016-07-14 6 views
1

Da Daten, die wie folgt aussehen:Wie findet man Ähnlichkeit im Dokumentfeld 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']} 

würde Ich mag einen Weg finden, eine Ähnlichkeit zwischen einem einzelnen Elemente und allen anderen Elementen in der Sammlung zu erhalten dann bringt sie mit der höchsten Ähnlichkeit in Ordnung. Ähnlichkeit basiert auf der Anzahl der Wörter gemeinsam haben, gibt es bereits eine Funktion int similar(String one, String two)

Zum Beispiel: Wenn ich die Ähnlichkeitsliste für about Feld foobar1 wollen, wäre es zurückgeben

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

ich tue dies mit Morphium, aber mit nur der MongoDB-Implementierung, könnte ich den Rest herausfinden

Antwort

1

Wenn Sie Text Ähnlichkeit im Feld berechnen müssen, ist eine Möglichkeit, dies zu erreichen, text index zu verwenden.

Zum Beispiel (in der mongo Shell), wenn Sie einen Textindex für die about Feld zu erstellen:

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

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

Sie eine Abfrage wie (zB aus https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score genommen) ausführen kann

Mit Ihren Beispieldokumenten sollte die Abfrage so etwas wie den folgenden Wert zurückgeben:

{ 
    "_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 
} 

die nach abnehmendem Ähnlichkeitswert sortiert sind. Beachten Sie, dass das Dokument foobar4 im Gegensatz zu Ihrem Beispielergebnis nicht zurückgegeben wird, da keines der abgefragten Wörter in foobar4 vorhanden ist.

Textindizes werden in MongoDB als spezieller Indextyp betrachtet und enthalten daher bestimmte Regeln für ihre Verwendung. Weitere Einzelheiten finden Sie unter:

Verwandte Themen