jokerteken voor mongoDB-voorvoegsel: fulltext-search ($text) zoekgedeelte met zoekstring

Ik heb mongodb met een $text-Indexen elementen zoals deze:

{
   foo: "my super cool item"
}
{
   foo: "your not so cool item"
}

Als ik zoek met

mycoll.find({ $text: { $search: "super"} })

ik krijg het eerste item (juist).

Maar ik wil ook zoeken met “uper” om het eerste item te krijgen – maar als ik het probeer:

mycoll.find({ $text: { $search: "uper"} })

Ik krijg geen resultaten.

Mijn vraag:
Als er een manier is om $text te gebruiken, zodat het resultaten vindt met een deel van de zoekreeks? (bijv. zoals '%uper%'in mysql)

Opgelet: ik vraag niet om alleen een regex-zoekopdracht – ik vraag om een ​​regex-zoekopdracht binnen een $text-search!


Antwoord 1, autoriteit 100%

Het is niet mogelijk om dit te doen met de operator $text.

Tekstindexen worden gemaakt met de termen die zijn opgenomen in de tekenreekswaarde of in een reeks tekenreeksen en de zoekopdracht is gebaseerd op die indices.

Je kunt alleen termen op een zin groeperen, maar er geen deel van uitmaken.

Lees $textoperatorreferentieen beschrijving van tekstindexen.


Antwoord 2, autoriteit 33%

Ik heb niet genoeg reputatie om op de jasenkoh-oplossing te reageren, maar dit is duidelijk de beste manier om met deze situatie om te gaan.

In de OP-situatie zou ik:

db.mycoll.createIndex( { foo: "text" } )
db.mycoll.createIndex( { foo: 1 } )
db.mycoll.find({$or: [{$text: {$search: 'uper'}}, {foo: {$regex: 'uper'}}]})

Voor betere prestaties (maar iets andere resultaten), vervangt u de laatste regel door:

db.mycoll.find({$or: [{$text: {$search: 'uper'}}, {foo: {$regex: '^uper'}}]})

Antwoord 3, autoriteit 31%

Wat u in uw tweede voorbeeld probeert te doen, is zoeken met een prefix met jokertekens in uw verzameling mycollin veld foo. Dit is niet iets waarvoor de tekstzoekfunctie is ontworpen en het is niet mogelijk om dit te doen met de $textoperator. Dit gedragbevat geen jokerteken prefix zoeken op een bepaald token in het geïndexeerde veld. U kunt echter ook een regex-zoekopdracht uitvoeren, zoals anderen suggereerden. Hier is mijn uitleg:

>db.mycoll.find()
{ "_id" : ObjectId("53add9364dfbffa0471c6e8e"), "foo" : "my super cool item" }
{ "_id" : ObjectId("53add9674dfbffa0471c6e8f"), "foo" : "your not so cool item" }
> db.mycoll.find({ $text: { $search: "super"} })
{ "_id" : ObjectId("53add9364dfbffa0471c6e8e"), "foo" : "my super cool item" }
> db.mycoll.count({ $text: { $search: "uper"} })
0

De operator $textondersteunt het zoeken naar een enkel woord, het zoeken naar een of meer woorden of het zoeken naar een woordgroep. Het soort zoekopdracht dat u wenst wordt niet ondersteund

De regex-oplossing:

> db.mycoll.find({foo:/uper/})
{ "_id" : ObjectId("53add9364dfbffa0471c6e8e"), "foo" : "my super cool item" }
> 

Het antwoord op je laatste vraag: om mysql-stijl %super%in mongoDB te doen, zou je hoogstwaarschijnlijk het volgende moeten doen:

db.mycoll.find( { foo : /.*super.*/ } );

4, Autoriteit 2%

Als u bij RGEX gaat, kunt u zoeken naar “Super Cool” maar niet “Super Item”, om beide verzoek te bereiken of een aanvraag met $ Text en $ Regex voor de zoekterm.

Zorg ervoor dat u zowel de tekstindexering als de normale indexering indexeert.

Other episodes