MongoDB 中的文本搜索,关键字搜索
Text search in MongoDB, keyword search
我正在尝试在我的 mongoDB 数据库中进行关键字搜索。在 mongoDB 控制台中:
db.logs.find({$text: {$search: 'key1'}})
给出了正确的结果。但是当我在我的 nodejs 控制器上使用 mongoose-text-search 时,我得到了一个错误。这是架构的定义:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var textSearch = require('mongoose-text-search');
var Log = new Schema({
keywords: [String],
description: String,
videoId: String,
logId: String,
date: Date,
robot: String
});
Log.plugin(textSearch);
Log.index({ keywords: 'text' });
module.exports = mongoose.model('log', Log);
在控制器中,在某些时候我会这样做:
Log.textSearch('key1', function(err,output) {
if (err){
res.send(500,err);
} else {
console.log(output);
}
});
响应是:
{"name":"MongoError","message":"no such command: text","ok":0,"errmsg":"no such command: text","code":59,"bad cmd":{"text":"logs","search":"key1"}}
现在,单是这条消息就会让您认为文本搜索不起作用,但正如我之前展示的那样。我是 运行 MongoDB shell 版本 3.0.2,因此默认情况下启用文本搜索。
出于某种原因,我很难理解 moongose 的文档...事实证明,这在普通查询中很容易做到(不需要插件)。只是为了说明如何完成它(不是我的实际代码,而是用于测试该想法的代码)
router.get('/keywordsearch', function (req,res) {
var query = Log.find();
var findKeywords = [];
if (req.query.keywords != '')
{
var words = req.query.keywords.split(",");
for (ii=0; ii<words.length; ii++)
findKeywords[ii] = {keywords: words[ii].trim()};
console.log(findKeywords);
query.or(findKeywords);
}
query.exec(function (err,logs) {
if (err){
res.send(500,err);
} else {
req.logsList = logs;
res.render('searchdb',{user:req.user,logs:req.logsList});
}
});
});
这意味着您可以使用以下关键字进行关键字搜索:
find({keyword: 'blablabla'})
并对许多关键字使用 OR 逻辑运算符。
我正在尝试在我的 mongoDB 数据库中进行关键字搜索。在 mongoDB 控制台中:
db.logs.find({$text: {$search: 'key1'}})
给出了正确的结果。但是当我在我的 nodejs 控制器上使用 mongoose-text-search 时,我得到了一个错误。这是架构的定义:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var textSearch = require('mongoose-text-search');
var Log = new Schema({
keywords: [String],
description: String,
videoId: String,
logId: String,
date: Date,
robot: String
});
Log.plugin(textSearch);
Log.index({ keywords: 'text' });
module.exports = mongoose.model('log', Log);
在控制器中,在某些时候我会这样做:
Log.textSearch('key1', function(err,output) {
if (err){
res.send(500,err);
} else {
console.log(output);
}
});
响应是:
{"name":"MongoError","message":"no such command: text","ok":0,"errmsg":"no such command: text","code":59,"bad cmd":{"text":"logs","search":"key1"}}
现在,单是这条消息就会让您认为文本搜索不起作用,但正如我之前展示的那样。我是 运行 MongoDB shell 版本 3.0.2,因此默认情况下启用文本搜索。
出于某种原因,我很难理解 moongose 的文档...事实证明,这在普通查询中很容易做到(不需要插件)。只是为了说明如何完成它(不是我的实际代码,而是用于测试该想法的代码)
router.get('/keywordsearch', function (req,res) {
var query = Log.find();
var findKeywords = [];
if (req.query.keywords != '')
{
var words = req.query.keywords.split(",");
for (ii=0; ii<words.length; ii++)
findKeywords[ii] = {keywords: words[ii].trim()};
console.log(findKeywords);
query.or(findKeywords);
}
query.exec(function (err,logs) {
if (err){
res.send(500,err);
} else {
req.logsList = logs;
res.render('searchdb',{user:req.user,logs:req.logsList});
}
});
});
这意味着您可以使用以下关键字进行关键字搜索:
find({keyword: 'blablabla'})
并对许多关键字使用 OR 逻辑运算符。