我目前让用户输入一个可以包含很多单词的搜索字符串。然后我将每个单词分开,然后根据每个单词构建正则表达式。然后,我通过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 += '.*';
答案 0 :(得分:1)
"A.*B"
是一个非常耗时的正则表达式,因为正则表达式搜索通常是贪婪的。因此,它会找到"A"
,然后".*"
将“消耗”剩余字符串的全部内容,然后尝试匹配"B"
。如果失败,它会在字符串末尾释放一个字符并尝试再次匹配"B"
。将您的查询中".*"
的数量乘以,您的效果会非常差。
创建更复杂的搜索查询而不是复杂的正则表达式要快得多。因此,不要试图将搜索查询放入单个正则表达式,而是尝试将其分解为简单搜索条件的组合,每个单词一个。即而不是“正则表达式匹配A. * B. * C ......”你写“(正则表达式匹配A)AND(正则表达式匹配B)AND(正则表达式匹配C)......”。搜索单个单词比查询要快得多,如果失败,则只会跳过任何后续条件,从而节省性能。
实际上,除非您在搜索查询中需要正则表达式功能,否则您可以完全摆脱正则表达式,将其替换为纯文本搜索,这总是更快。