Mongodb部分匹配

Gor*_*Gor 7 javascript regex fuzzy-search mongodb levenshtein-distance

如何以一个levenshtein距离在mongodb中获取所有文档。

我有足球队的收藏。

{
    name: 'Real Madrir',
    nicknames: ['Real', 'Madrid', 'Real Madrir' ... ]
}
Run Code Online (Sandbox Code Playgroud)

与用户搜索Real MadidMaddrid或别的东西。

我想将包含昵称的所有文档返回给定搜索字符串的距离为0或1 levenshtein的所有文档。

我认为有两种方式,mongodb全文搜索或正则表达式。

那我可以写这样的正则表达式或查询吗?

谢谢。

小智 6

对于全文搜索,首先必须在您的字段上创建一个文本索引nicknames。在创建索引之前插入的文档将不可搜索。该搜索仅适用于创建索引插入的文档。然后,当您使用MongoDb $text$search运算符执行搜索时,MongoDb将返回其nicknames字段与搜索文本相对应的文档。对于正则表达式匹配,MongoDb具有一个$regex您可以使用运算符。

以下是几个简短的示例:

全文搜索

  1. 将此脚本另存为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']
})
Run Code Online (Sandbox Code Playgroud)
  1. 打开终端并导航到保存的目录football.js,然后通过键入对本地MongoDb实例运行此脚本mongo football.js

  2. mongo在终端上键入以打开MongoDb Shell并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"}})
Run Code Online (Sandbox Code Playgroud)

正则表达式

如果要使用正则表达式进行搜索,则无需创建索引。只需使用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/}})
Run Code Online (Sandbox Code Playgroud)

猫鼬

这是使用mongoose在NodeJS中进行这些搜索的方式:

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){
    // ...
  }

})
Run Code Online (Sandbox Code Playgroud)