使用PHP -Mongodb从大型电子邮件地址列表中查找坏词

时间:2013-10-17 13:56:31

标签: mongodb

我有一个来自文件的大量电子邮件地址。它有大约100万个电子邮件ID。我有垃圾邮件,垃圾邮件等坏词列表,它包含20,000多个坏词。

我需要验证电子邮件ID。如果在电子邮件ID中的任何位置存在不良单词,则会将其标记为无效。

例如;

testspam@gmail.com - 无效

newuser@desspam.com - 无效

我想知道哪个是最快的比较方法,因为数组循环需要时间。

我尝试了以下方法

//$keyword_list- array of bad words;

//$check_key- the email id which need to validate

$arrays = array_chunk($keyword_list, 2000);
for($i=0;$i<count($arrays);$i++)
{
    if (preg_match('/'.implode('|', $arrays[$i]).'/', $check_key, $matches)){
        return 1;
    }

}

上述方法在比较100万个数据时花费的时间更多。

接下来,我们尝试使用以下代码,这也需要更多时间

//$contain  = bad words separated by '|' 
// $str - the email id which need to validate

if(stripos($contain,"|") !== false)
{
    $s = preg_split('/[|]+/i',$contain);
    $len = sizeof($s);
    for($i=0;$i < $len;$i++)
    {
        if(stripos($str,$s[$i]) !== false)
        {
            return(true);
        }
    }
}
if(stripos($str,$contain) !== false)
{
    return(true);
}

return(false);

最后我尝试了Mongodb Text Search。它可以快速解决以下问题

如果'Hell'是我的坏名单中的单词,我的电子邮件ID就像 head@e-hellinglysussex.sch.uk,然后Mongodb文本搜索将不匹配。

这是我使用的代码;

$ret = $db->command( array("text" =>$section, "search" => $keyword_string,     "limit"=>$cnt_finalnonmatch));
where $section = Collection name, 
$keyword_string = Comparing keywords string separated by space, for eg "Hell Spam Junk" etc,
$cnt_finalnonmatch = total number of comparing email ids

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

我不完全确定,但我怀疑问题是当你搜索文本时'地狱'不等于'地狱',因为mongodb区分大小写。

解决方案应该是强制所有字符串和单词为小写(或大写)

答案 1 :(得分:0)

我们使用Mongodb'喜欢'来解决这个问题;

$ keywords = $ key ['keyword']; //关键字需要比较 $ regexObj = new MongoRegex(“/".$ keywords。”/ i“); // MongoRegex函数declration $ where = array($ section =&gt; $ regexObj); // $ section是集合名称 $ resultset = $ info-&gt; find($ where);