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 Madid
的Maddrid
或别的东西。
我想将包含昵称的所有文档返回给定搜索字符串的距离为0或1 levenshtein的所有文档。
我认为有两种方式,mongodb全文搜索或正则表达式。
那我可以写这样的正则表达式或查询吗?
谢谢。
小智 6
对于全文搜索,首先必须在您的字段上创建一个文本索引nicknames
。在创建索引之前插入的文档将不可搜索。该搜索仅适用于创建索引后插入的文档。然后,当您使用MongoDb $text
和$search
运算符执行搜索时,MongoDb将返回其nicknames
字段与搜索文本相对应的文档。对于正则表达式匹配,MongoDb具有一个$regex
您可以使用运算符。
以下是几个简短的示例:
全文搜索
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)
打开终端并导航到保存的目录football.js
,然后通过键入对本地MongoDb实例运行此脚本mongo football.js
。
mongo
在终端上键入以打开MongoDb Shell并football
通过键入切换到数据库use football
。
进入足球数据库后,使用来搜索您的文档之一 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)
归档时间: |
|
查看次数: |
4332 次 |
最近记录: |