【问题标题】:How to improve multiword match regex如何改进多词匹配正则表达式
【发布时间】:2016-02-22 03:03:12
【问题描述】:

我目前让用户输入一个可以包含多个单词的搜索字符串。然后我将每个单词分开,然后根据每个单词构建正则表达式。然后,我通过 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 += '.*';

【问题讨论】:

  • 如果您的 mongo 版本是 v3.2,那么 $text 可能是一种选择。
  • var regex = new RegExp(search.split(/\s+/).join('|'));

标签: javascript regex mongodb


【解决方案1】:

"A.*B" 是一个非常耗时的正则表达式,因为正则表达式搜索通常是贪婪的。所以它会找到"A",然后".*" 将“消耗”整个剩余字符串,然后尝试匹配"B"。否则,它将在字符串末尾释放一个字符并尝试再次匹配"B"。将其乘以查询中".*" 的数量,您会得到非常差的性能。

创建更复杂的搜索查询而不是复杂的正则表达式会快得多。因此,与其尝试将您的搜索查询放入单个正则表达式,不如尝试将其分解为简单搜索条件的组合,每个词一个。 IE。而不是“正则表达式匹配 A.*B.*C...”,而是写“(正则表达式匹配 A)AND(正则表达式匹配 B)AND(正则表达式匹配 C)...”。搜索单个单词比您的查询要快得多,如果搜索失败,则简单地跳过任何后续条件,从而节省性能。

实际上,除非您在搜索查询中需要正则表达式功能,否则您可以完全摆脱正则表达式,用纯文本搜索替换它们,这样总是更快。

【讨论】:

    猜你喜欢
    • 2013-01-04
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 2011-07-22
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多