gpt4 book ai didi

MongoDB不区分大小写索引 "starts with"性能问题

转载 作者:IT老高 更新时间:2023-10-28 13:22:57 26 4
gpt4 key购买 nike

在发现 3.3.11 supports case insensitive index 之后(使用排序规则)我已经重建了包含 4000 万条记录的数据库来处理这个问题。替代方法是添加例如特定于不区分大小写的搜索和索引的小写字段。

我所做的是要求 MongoDB 在创建时支持对我的集合进行排序,即 suggested here .所以我这样做是为了让整个集合不区分大小写:

db.createCollection("users", {collation:{locale:"en",strength:1}})

加载集合后,我尝试了直接查询,例如:

db.users.find({full_name:"john doe"})

...那些在大约 10 毫秒内返回 50 个结果。它不区分大小写 - 所以一切都很好。但后来我尝试了类似的东西:

db.users.find({full_name:/^john/})

...或...

db.users.find({full_name:/^john/i})

...这需要超过 5 分钟。我太失望了。在执行 explain() 之后,事实证明该索引显然正在被使用,但查询仍然需要很长时间才能执行。这可以归因于错误或不完整的开发版本,还是我做错了什么?

当我进行“开始于”正则表达式搜索时,查询应该快如闪电。有什么想法吗?

最佳答案

编辑:有一个可行的解决方法。基本上,如果您要搜索的单词是“bob”,您可以搜索 $lt:"boc"(将最后一个字符加一)和 $gte "bob"。这将使用索引。您可以像这样使用我在下面制作的以下功能(警告它不一定没有错误,但几乎可以正常工作):

var searchCriteria = {};
addStartsWithQuery(searchCriteria, "firstName", "bo");
People.find(searchCriteria).then(...);

//searchCriteria will be
/*
{
$and:[
{firstName:{$gte:"bo"}},
{firstName:{$lt:"bp"}}
]
}
*/


//now library functions that will automatically generate the correct query and add it to `searchCriteria`. Of course for complicated queries you may have to modifiy it a bit.
function getEndStr(str) {
var endStrArr = str.toLocaleLowerCase('en-US').split("");
for (var i = endStrArr.length - 1; i >= 0; --i) {
var lastChar = endStrArr[i];
if(lastChar === "z"){
return endStrArr.join("") + "zzzzzzzzzzzz";
}
var nextChar = String.fromCharCode(lastChar.charCodeAt(0) + 1);
if (nextChar === ":")
nextChar = "a";
if (nextChar !== false) {
endStrArr[i] = nextChar;
return endStrArr.join("");
}
endStrArr.pop();
}
}
function addStartsWithQuery(searchCriteria, propertyName, str) {
if (!(typeof str === 'string') || !str.length)
return;
var endStr = getEndStr(str);
if (endStr) {
if (!searchCriteria.$and)
searchCriteria.$and = [];
searchCriteria.$and.push({
[propertyName]: {
$gte: str
}
});
searchCriteria.$and.push({
[propertyName]: {
$lt: endStr
}
});
} else {
searchCriteria[propertyName] = {
$gte: str
}
}
}

事实证明 MongoDB 官方不支持它!我已经链接到 JIRA 中的一个问题,他们清楚地说明了这一点。不幸的是,这使得排序规则的用处大大降低。让我们尽快解决这个问题!从技术上讲,我注意到即使它使用索引,索引也使用 "[\"\", {})", 作为它的索引边界之一,它总是返回index,所以索引扫描是没用的。查询的下一阶段会像平常一样过滤这些结果。

https://jira.mongodb.org/browse/DOCS-9933

为这个问题投票,让他们解决它! https://jira.mongodb.org/browse/SERVER-29865

关于MongoDB不区分大小写索引 "starts with"性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39160072/

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