使用MongoDB Regex和PHP搜索字符串中的多个参数

时间:2013-07-31 03:18:58

标签: php regex mongodb

我正在尝试搜索我的集合,查找body属性包含所有搜索关键字的所有事件。

示例字符串 - "The black cat is definitely purple."

关键字"black", "purple"将返回字符串。

关键字"black", "dog"返回该字符串。

我一直在搜索一些主题和谷歌搜索,但似乎找不到合适的语法来做到这一点。

目前,我正在使用逗号分隔的一串关键字,将其展开为数组,然后将其放入MongoRegex Object。我知道我的语法是关闭的,因为当我只发送一个关键字时它可以工作,但是当有多个关键字时,我没有得到任何我期望得到的结果。

当前方法:

<?php

function search_topics($array)
{
    include_once('config.php');
    $collection = get_connection($array['flag']);

    $x = 0;
    $string = null;
    $search_results = null;
    $keywords = explode(',', $array['search']); 
    $end_of_list = count($keywords);

    while ($x < $end_of_list)
    {
        $string = $string."/".$keywords[$x];
        $x++;
        if($x >= $end_of_list)
        {
            $string = $string."/i";
        }
    }

    if ($string != null)
    {   
        try
        {
            $regex_obj = new MongoRegex($string);
            $cursor = $collection->find(array('body' => $regex_obj));
        }
        catch (MongoCursorException $e)
        {
            return array('error' => true, 'msg' => $e->getCode());
        }

        foreach($cursor as $post)
        {
            $search_results[] = $post;
        }

        if ($search_results != null && count($search_results) > 1)
        {       
            usort($search_results, 'sort_trending');
        }

        return array('error' => false, 'results' => $search_results);
    }
    else
    {
        return array('error' => false, 'results' => null);
    }
}
?>

因此,如果我在black中发送字符串$array['search'],我的对象就会形成/black/i并返回该字符串。

如果我在black,cat中发送字符串$array['search'],我的对象就会形成/black/cat/i并返回null

有人能用这种正则表达式语法指向我正确的方向吗?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

我建议你不要使用正则表达式来代替MongoDB的文本搜索功能,它专门用于这样的情况:http://docs.mongodb.org/manual/core/text-search/

您可以像这样使用它(在MongoDB shell上):

use admin
db.runCommand( { setParameter: 1, 'textSearchEnabled' : 1 } );
use test
db.so.ensureIndex( { string: 'text' } );
db.so.insert( { string: "The black cat is definitely purple." } );
db.so.runCommand( 'text', { search: '"cat" AND "dog"' } )
db.so.runCommand( 'text', { search: '"cat" AND "purple"' } )

命令不返回游标,而是返回包含results字段中所有查询结果的一个文档。对于最后一个搜索命令,结果为:

{
    "queryDebugString" : "cat|purpl||||cat|purple||",
    "language" : "english",
    "results" : [
        {
            "score" : 2.25,
            "obj" : {
                "_id" : ObjectId("51f8db63c0913ecf728ff4d2"),
                "string" : "The black cat is definitely purple."
            }
        }
    ],
    "stats" : {
        "nscanned" : 2,
        "nscannedObjects" : 0,
        "n" : 1,
        "nfound" : 1,
        "timeMicros" : 135
    },
    "ok" : 1
}

在PHP中,要runCommand打开文本搜索,您可以使用:

$client->database->command( array( 
    'setParameter' => 1, 
    'textSearchEnabled' => 1 
) );

文本搜索本身为:

$client->database->command( array(
    'text' => 'collectionName', 
    'search' => '"cat" AND "purple"' 
) );