gpt4 book ai didi

mongodb - 嵌入式文档中的全文本搜索

转载 作者:行者123 更新时间:2023-12-01 10:21:42 25 4
gpt4 key购买 nike

这是我的文档模式

"translation" : {
"en" : {
"name" : "brown fox",
"description" : "the quick brown fox jumps over a lazy dog"
},
"it" : {
"name" : "brown fox ",
"description" : " the quick brown fox jumps over a lazy dog"
},
"fr" : {
"name" : "renard brun ",
"description" : " le renard brun rapide saute par-dessus un chien paresseux"
},
"de" : {
"name" : "brown fox ",
"description" : " the quick brown fox jumps over a lazy dog"
},
"es" : {
"name" : "brown fox ",
"description" : " el rápido zorro marrón salta sobre un perro perezoso"
}
},

现在我必须为以上文档添加文本索引。我该如何实现?
我已经在翻译中添加了文本索引,但是由于名称和描述在语言前缀(在对象内)之内,因此无法正常工作。我也必须分别给出名称和描述的文字权重(文字分数)。即名称的文字分数为5,描述的分数为2。所以我不能给通配 rune 本索引
{'$**': 'text'}

我也尝试过使用 'translation.en.name': 'text',但这种方法不起作用,而且我的语言是动态的,因此增加了,因此对于这种情况最好的解决方案是什么

任何帮助将不胜感激。

最佳答案

因为嵌入字段是动态的,所以最好的方法是修改架构,例如translation字段成为嵌入文档的数组。映射当前结构的这种模式的示例如下:

"translation": [    
{
"lang": "en",
"name" : "brown fox",
"description" : "the quick brown fox jumps over a lazy dog"
},
{
"lang": "it",
"name" : "brown fox ",
"description" : " the quick brown fox jumps over a lazy dog"
},
{
"lang": "fr",
"name" : "renard brun ",
"description" : " le renard brun rapide saute par-dessus un chien paresseux"
},
{
"lang": "de",
"name" : "brown fox ",
"description" : " the quick brown fox jumps over a lazy dog"
},
{
"lang": "es",
"name" : "brown fox ",
"description" : " el rápido zorro marrón salta sobre un perro perezoso"
}
]

使用此模式,可以很容易地将文本索引应用于 namedescription字段:
db.collection.createIndex(
{
"translation.name": "text",
"translation.description": "text"
}
)

至于修改架构,您将需要使用一个API,该API允许您批量更新集合,而 Bulk API 会为您执行此操作。这些将提供更好的性能,因为您将以大约1000个批次的方式将操作发送到服务器,这将为您带来更好的性能,因为您不是将每个请求发送到服务器,而是每1000个请求中仅发送一次。

下面演示了这种方法,第一个示例使用MongoDB版本> = 2.6和<3.2中可用的Bulk API。它通过将所有转换字段更改为数组来更新集合中的所有文档:
var bulk = db.collection.initializeUnorderedBulkOp(),
counter = 0;

db.collection.find({
"translation": {
"$exists": true,
"$not": { "$type": 4 }
}
}).snapshot().forEach(function (doc) {
var localization = Object.keys(doc.translation)
.map(function (key){
var obj = doc["translation"][key];
obj["lang"] = key;
return obj;
});
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "translation": localization }
});

counter++;
if (counter % 1000 === 0) {
bulk.execute(); // Execute per 1000 operations
// re-initialize every 1000 update statements
bulk = db.collection.initializeUnorderedBulkOp();
}
})
// Clean up remaining operations in queue
if (counter % 1000 !== 0) { bulk.execute(); }

下一个示例适用于新的MongoDB 3.2版,该版本自 deprecated起为批量API,并使用 提供了一组较新的api。 bulkWrite()

它使用与上述相同的游标,但使用相同的 forEach()游标方法通过批量操作创建数组,以将每个批量写入文档插入数组。由于写命令最多只能接受1000个操作,因此您需要将操作分组以最多具有1000个操作,并在循环达到1000次迭代时重新初始化数组:
var cursor = db.collection.find({ 
"translation": {
"$exists": true,
"$not": { "$type": 4 }
}
}).snapshot(),
bulkUpdateOps = [];

cursor.forEach(function(doc){
var localization = Object.keys(doc.translation)
.map(function (key){
var obj = doc["translation"][key];
obj["lang"] = key;
return obj;
});
bulkUpdateOps.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "translation": localization } }
}
});

if (bulkUpdateOps.length === 1000) {
db.collection.bulkWrite(bulkUpdateOps);
bulkUpdateOps = [];
}
});

if (bulkUpdateOps.length > 0) { db.collection.bulkWrite(bulkUpdateOps); }

关于mongodb - 嵌入式文档中的全文本搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38409020/

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