我正在尝试使用连接到MongoDB数据库的Node.JS
(全部托管在heroku
上,因此使用MongoLab
插件)来执行文本搜索。我想搜索我的文档中的某些字段(字符串或字符串数组,但我可以将它们更改为所有需要的字符串)。
以下代码希望能够搜索关键字变量的'title'字段或'ingredients'字段,然后返回这些结果。
我怀疑ensureIndex
行(同时尝试ensureIndex
和createIndex
),因为删除它们不会改变程序的功能。
任何帮助将不胜感激!
app.get('/searchtitle', function(request, response) {
response.header("Access-Control-Allow-Origin", "*");
response.header("Access-Control-Allow-Headers", "X-Requested-With");
response.set('Content-Type', 'application/json');
var type = request.query.type;
var keyword = request.query.keyword;
if (type == 'title') {
db.collection('Test_Recipes').ensureIndex( { title: "text" } );
db.collection('Test_Recipes').find({
$text: {$search: keyword }
}).toArray(function(err, results){
response.send(JSON.stringify(results)) });
}
else {
console.log("in else case: type is "
+ type + " and keyword is " +keyword);
db.collection('Test_Recipes').ensureIndex({ingredients :"text"});
db.collection('Test_Recipes').find({
ingredients: {$elemMatch: keyword } })
.toArray(function(err, results){
response.send(JSON.stringify(results)) });
}
}
答案 0 :(得分:0)
Indexes
,与任何数据库一样,只需在首次创建collection
时创建一次。索引创建是一项代价高昂的操作和blocking操作。
从mongoDB 3.0
开始,方法createIndex()
和ensureIndex()之间没有区别,并且它们中的任何一个都应该用于在集合上创建索引,只在服务器端创建一次,当创建集合并仅在需要时进行修改。
要为title
和ingredients
字段编制索引,您需要在集合上创建index
:
db.collection.createIndex({"ingredients":"text","title":"text"})
这将确保在插入文档时两个字段均为indexed
。
我对ensureIndex行表示怀疑(同时尝试了ensureIndex和 createIndex)因为删除它们不会改变功能 该计划。任何帮助将不胜感激!
这是因为createIndex()操作的行为方式。 如果索引再次在同一字段上创建,则只有第一次调用此方法才会成功,而其他调用只会被忽略。
然后只是查询,如下所示将查询keyword
和title
字段中的ingredients
。
var type = request.query.type;
var keyword = request.query.keyword;
db.collection('Test_Recipes').find({
$text: {$search: keyword }
}).toArray(function(err, results){
response.send(JSON.stringify(results))
});