我正在使用mongo db nodejs和mongoose。
我想使用mongodb新文本搜索。
尝试像aaronheckmann一样使用mongoose-text-search,但我一直都会收到错误。
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
var Items = new Schema({
type : { type : String , default:""},
color : { type : [String] , default:""},
category_A : { type : String , default:""},
category_B : { type : String , default:""},
category_C : { type : String , default:""},
});
var textSearch = require("mongoose-text-search");
Items.plugin(textSearch);
var ItemModel = mongoose.model('Item', Items);
Items.index({
type :"text",
color :"text",
category_A :"text",
category_B :"text",
category_C :"text"
},
{
name: "best_match_index",
weights: {
type: 5,
color: 4,
}
}
)
ItemModel.textSearch('D', function (err, output) {
if (err)
console.log(err);
else
console.log(output)
})
运行时,我得到:
no text index for: db.items
谢谢!
答案 0 :(得分:12)
在将架构注册为模型之前,您必须将插件添加到架构。
<强>已更新强>
同样,您需要在注册模型之前在架构上定义索引。因此,重新排序代码的这一部分,如下所示:
var textSearch = require("mongoose-text-search");
Items.plugin(textSearch);
Items.index({
type :"text",
color :"text",
category_A :"text",
category_B :"text",
category_C :"text"
}, {
name: "best_match_index",
weights: {
type: 5,
color: 4
}
});
var ItemModel = mongoose.model('Item', Items);
请注意,您还需要通过mongoose.connect
调用将mongoose连接到数据库,我在任何地方都看不到,但我假设您正在执行此代码范围之外的操作。以下是我用来确认其有效的完整代码:
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
var Items = new Schema({
type : { type : String , default:""},
color : { type : [String] , default:""},
category_A : { type : String , default:""},
category_B : { type : String , default:""},
category_C : { type : String , default:""},
});
var textSearch = require("mongoose-text-search");
Items.plugin(textSearch);
Items.index({
type :"text",
color :"text",
category_A :"text",
category_B :"text",
category_C :"text"
}, {
name: "best_match_index",
weights: {
type: 5,
color: 4,
}
});
var ItemModel = mongoose.model('Item', Items);
mongoose.connect('mongodb://localhost/test', function (err) {
ItemModel.textSearch('D', function (err, output) {
if (err)
console.log(err);
else
console.log(output);
mongoose.disconnect();
});
});
创建的文本搜索索引在shell中如下所示:
test> db.items.getIndexes()
[
{
"v": 1,
"key": {
"_id": 1
},
"ns": "test.items",
"name": "_id_"
},
{
"v": 1,
"key": {
"_fts": "text",
"_ftsx": 1
},
"ns": "test.items",
"name": "best_match_index",
"weights": {
"category_A": 1,
"category_B": 1,
"category_C": 1,
"color": 4,
"type": 5
},
"background": true,
"safe": null,
"default_language": "english",
"language_override": "language",
"textIndexVersion": 1
}
]
答案 1 :(得分:5)
npm install mongoose-text-search
https://github.com/aheckmann/mongoose-text-search
发现其他猫鼬功能的好地方是http://plugins.mongoosejs.com
答案 2 :(得分:2)
据我所知,大多数驱动程序尚未实现text
搜索命令/功能,因此调用它的唯一方法是使用runCommand
函数。
您需要确保首先在数据库上启用它(显然创建文本索引)。
http://docs.mongodb.org/manual/tutorial/enable-text-search/
或运行时
db.adminCommand( { setParameter : 1, textSearchEnabled : true } )