我目前让用户输入一个可以包含许多单词的搜索字符串。然后,我将每个单词分开,然后根据每个单词构建正则表达式。然后,我通过 MongoDB 使用正则表达式搜索来搜索包含 200,000 多个条目的列表。它运作良好,但性能相当糟糕。任何可能提高性能的正则表达式建议都将受到赞赏!
//this is an example search
var search = "angel alter";
var searchSplitted = search.split(" ");
var expression = '';
//This is how I build my regex
for(i=0; i<searchSplitted.length; i++){
expression += '(?=.*' + searchSplitted[i] + ')';
}
expression += '.*';
最佳答案
"A.*B"
是一个非常耗时的正则表达式,因为正则表达式搜索通常是贪婪的。因此它会找到 "A"
,然后 ".*"
将“消耗”整个剩余字符串,然后尝试匹配 "B"
。如果失败,它将释放字符串末尾的一个字符并尝试再次匹配 "B"
。将其乘以查询中的 ".*"
数量,您会得到非常差的性能。
创建更复杂的搜索查询而不是复杂的正则表达式会快得多。因此,不要尝试将搜索查询放入单个正则表达式中,而是尝试将其分解为简单搜索条件的连词,每个词一个。 IE。而不是“正则表达式匹配 A.*B.*C...”,而是写“(正则表达式匹配 A) AND (正则表达式匹配 B) AND (正则表达式匹配 C)...”。对单个单词的搜索比查询要快得多,如果失败,则会跳过任何后续条件,从而节省性能。
实际上,除非您在搜索查询中需要正则表达式功能,否则您可以完全摆脱正则表达式,用纯文本搜索替换它们,这样总是更快。
关于javascript - 如何改进多字匹配正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35545149/