Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MongoDB正则表达式和PHP搜索字符串中的多个参数_Php_Regex_Mongodb - Fatal编程技术网

使用MongoDB正则表达式和PHP搜索字符串中的多个参数

使用MongoDB正则表达式和PHP搜索字符串中的多个参数,php,regex,mongodb,Php,Regex,Mongodb,我正在尝试搜索我的集合,查找body属性包含所有搜索关键字的所有事件 示例字符串-“黑猫绝对是紫色的。” 关键词“黑色”、“紫色”将返回字符串 关键词“black”,“dog”将不返回该字符串 我一直在浏览一些主题和谷歌搜索,但似乎找不到合适的语法来实现这一点 目前,我正在获取一个由逗号分隔的关键字字符串,将其分解为一个数组,然后将其放入一个MongoRegex对象。我知道我的语法是关闭的,因为当我只发送一个关键字时,它就工作了,但当有多个关键字时,我不会得到任何我期望得到的结果 目前的做法:

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

示例字符串-
“黑猫绝对是紫色的。”

关键词
“黑色”、“紫色”
将返回字符串

关键词
“black”,“dog”
返回该字符串

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

目前,我正在获取一个由逗号分隔的关键字字符串,将其分解为一个数组,然后将其放入一个
MongoRegex对象
。我知道我的语法是关闭的,因为当我只发送一个关键字时,它就工作了,但当有多个关键字时,我不会得到任何我期望得到的结果

目前的做法:

<?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);
    }
}
?>

因此,如果我在
$array['search']
中发送字符串
black
,我的对象将由
/black/I
组成,并返回该字符串

如果我在
$array['search']
中发送字符串
black,cat
,则我的对象由
/black/cat/I
组成,并返回
null

有人能用这个正则表达式语法给我指出正确的方向吗

提前感谢您的帮助


Nathan

我建议您使用MongoDB的文本搜索功能,而不是正则表达式,它专门针对以下情况:

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

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

{
    "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"' 
) );

这里有一些关于匹配所有单词的问题:大多数情况下,这将用于返回多个文档。那么,既然您说它返回一个文档而不是光标,那么这种方法会起作用吗?当然,它返回一个文档,但是如果搜索查询找到这些结果,
results
字段当然会返回多个结果。也许您可以帮我提供最新的尝试和答案-
$client->database->command( array(
    'text' => 'collectionName', 
    'search' => '"cat" AND "purple"' 
) );