gpt4 book ai didi

javascript - MongoDB部分匹配

转载 作者:IT老高 更新时间:2023-10-28 12:29:30 25 4
gpt4 key购买 nike

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

我为足球队收藏。

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

并且用户搜索了 MaddridReal Madid 或其他内容。

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

我觉得有两种方式,mongodb全文搜索或者regex。

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

谢谢。

最佳答案

对于全文搜索,首先您必须创建一个 Text Index在您的 nicknames field 。在创建索引之前插入的文档将不可搜索。搜索仅适用于在创建索引之后插入的文档。然后当您使用 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']
})
  1. 打开您的终端并导航到您保存 football.js 的目录,然后通过键入 mongo football.js 对本地 MongoDb 实例运行此脚本.

  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"}})

正则表达式

如果您想使用正则表达式进行搜索,则无需创建索引。只需使用 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

这就是使用 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){
// ...
}

})

关于javascript - MongoDB部分匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40818069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com