Mongodb partial match

How to get all documents in mongodb with one levenshtein distance.

I have a collection for football teams.

{
    name: 'Real Madrir',
    nicknames: ['Real', 'Madrid', 'Real Madrir' ... ]
}

And the user was looking for Real Madidof Maddridor something else.

I want to return all documents containing aliases with a distance of 0 or 1 levenshina to the given search string.

I think there are two ways: full-text search mongodb or regular expression.

Can I write such a regular expression or query?

Thank.

+4
source share
1 answer

Text Index nicknames. , , . , . , MongoDb $text $search, MongoDb , nicknames . MongoDb $regex, .

:

  • script football.js. teams .
// create football database
var db = connect("localhost:27017/football");

/* 
   note:
   You may also create indexes from your console
   using the MongoDb shell. Actually each of these
   statements may be run from the shell. I'm using
   a script file for convenience.
*/

// create Text Index on the 'nicknames' field 
// so full-text search works
db.teams.createIndex({"nicknames":"text"});

// insert two teams to search for
db.teams.insert({
    name: 'Real Madrir',
    nicknames: ['Real', 'Madrid', 'Real Madrir' ]
})

db.teams.insert({
    name: 'Fake Madrir',
    nicknames: ['Fake']
})
  1. , football.js, script MongoDb, mongo football.js.

  2. mongo , MongoDb football, use football.

  3. , , db.teams.find({"$text":{"$search":"<search-text>"}})

> use football

// find Real Madrir
> db.teams.find({"$text":{"$search":"Real"}})

// find Fake Madrir
> db.teams.find({"$text":{"$search":"Fake"}})

Regex

, . mongodb $regex:

//find Real Madrir
db.teams.find({"nicknames": {"$regex": /Real/}})

db.teams.find({"nicknames": {"$regex": /Real Madrir/}})

//find Fake Madrir
db.teams.find({"nicknames": {"$regex": /Fa/}})

db.teams.find({"nicknames": {"$regex": /ke/}})

Mongoose

, NodeJS, mongoose:

var searchText = "Madrir"; // or some value from request.body

var searchRegex = new RegExp(searchText);

var fullTextSearchOptions = {
  "$text":{
    "$search": searchText
  }
};

var regexSearchOptions = {
  "nicknames": {
    "$regex": searchRegex
  }
};

// full-text search
Team.find(fullTextSearchOptions, function(err, teams){

  if(err){
    // ...
  }else if(teams){
    // ...
  }

})

// regex search
Team.find(regexSearchOptions, function(err, teams){

  if(err){
    // ...
  }else if(teams){
    // ...
  }

})
+4

Source: https://habr.com/ru/post/1662016/


All Articles