【发布时间】:2019-12-18 03:27:15
【问题描述】:
我有一个基本的 mongoose 架构,需要我在它的两个字段上创建一个文本索引:名称和描述。
这是我的猫鼬连接选项:
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
mongoose.set('useNewUrlParser', true);
const mongoOptions = {
useNewUrlParser: true,
autoIndex: false,
reconnectTries: Number.MAX_VALUE,
reconnectInterval: 500,
poolSize: 10,
bufferMaxEntries: 0
};
mongoose.connect(MONGOURI, mongoOptions);
这是我的架构:
const ASchema = new mongoose.Schema({
name: {type: String, text: true, index: true, required: true, maxlength: [100, 'Name must be less than 100 characters']},
description: {type: String, text: true, index: true, required: true, maxlength: [500, 'Description must be less than 500 characters']},
meta: {tags: [String]}
});
ASchema.options.autoIndex = true;
ASchema.index({
name: 'text',
description: 'text',
}, {
weights: {
name: 5,
description: 3,
},
});
var A = mongoose.model("AModel", ASchema);
module.exports = A;
由于查询的某些原因,我使用以下方法创建:
app.post('/search', (req, res, next) => {
let query = req.query.q
console.log(query);
A.find({
$text: { $search: query }
}, { score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )
.then(q => {
console.log(q); res.send(q)
})
.catch(next)
});
只有当我的查询字符串在 name 字段中时,我才会得到结果。 然而,当我输入描述中出现的句子或单词 ONLY 时,我会返回一个空数组。
在我的 mongo shell 上调用 db.amodels.getIndexes() 会返回以下内容:
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "adatabase.amodels"
},
{
"v" : 2,
"key" : {
"_fts" : "text",
"_ftsx" : 1
},
"name" : "name_text",
"ns" : "adatabase.amodels",
"background" : true,
"weights" : {
"name" : 1
},
"default_language" : "english",
"language_override" : "language",
"textIndexVersion" : 3
}
]
我可以从这个以及我的 mlab 实例中看到,我的 复合索引 尚未创建,也没有分配适当的权重。
致电db.amodels.ensureIndex({"description": "text"})
返回一个IndexOptionsConflict
{
"operationTime" : Timestamp(1565476058, 1),
"ok" : 0,
"errmsg" : "Index: { v: 2, key: { _fts: \"text\", _ftsx: 1 }, name: \"description_text\", ns: \"adatabase.amodels\", weights: { description: 1 }, default_language: \"english\", language_override: \"language\", textIndexVersion: 3 } already exists with different options: { v: 2, key: { _fts: \"text\", _ftsx: 1 }, name: \"name_text\", ns: \"adatabase.amodels\", background: true, weights: { name: 1 }, default_language: \"english\", language_override: \"language\", textIndexVersion: 3 }",
"code" : 85,
"codeName" : "IndexOptionsConflict",
"$clusterTime" : {
"clusterTime" : Timestamp(1565476058, 1),
"signature" : {
"hash" : BinData(0,"FMoSr4UQZWqocfrRTFvGoa62TsY="),
"keyId" : NumberLong("6723301754588364801")
}
}
}
我只是在某个地方搞砸了吗?我当然希望如此。
【问题讨论】: