1

我正在使用 mongodb 构建一个基本的搜索引擎,我已经验证了基本查询在 mongo shell 中工作。不过,我不太了解如何将其翻译成 PHP。

输入字符串中的空格表示“和”运算符和 | 或管道字符是“或”运算符。输入查询更改,但可能是以下内容(减去引号!):

'o g|ra'

这相当于写:

(o&&g)||(ra)

基本的 mongo 查询(请注意,我并不是每次都试图翻译这个确切的查询,我需要它在 $ands 和 $ors 的数量方面具有灵活性)。已经对此进行了测试,并且效果很好:

db.scores.find({$or:[{Title:/o/i, Title: /g/i},{Title:/ra/i}])

我在 PHP 中生成的代码是这样的:

if(strstr($textInput, '|') != FALSE)
{
    foreach($orArray as $item)
    {
        $itemMod = explode( " " , $item);
        array_push($stringArray, $itemMod);
    }

    $masterAndQueryStack = array();

    foreach ($stringArray as $varg)
    {
            $multiAndQuerySet = array();

            foreach ($varg as $obj)
            {
                $searchText = '/'. $obj .'/i';
                $regexObj = new MongoRegex( $searchText ) ; 
                $singleQuery = array('Title' => $regexObj); 
                array_push($multiAndQuerySet , $singleQuery);
            }
            array_push($masterAndQueryStack , $multiAndQuerySet);

    }

    $orAndQueryStack =  array('$or' => $masterAndQueryStack);
    return $orAndQueryStack ;
}

这是 PHP 代码返回的查询,您可以看到 和 术语已放入数组中。如果不将它们推送到数组,我看不到任何存储这些的方法,但是似乎 mongodb 的 $or 不喜欢接受数组,我只是不确定如何重新设计搜索算法来解决这个问题。

Array 
(
    [$or] => Array
    (
        [0] => Array 
        ( 
            [0] => Array ( [Title] => MongoRegex Object ( [regex] => o [flags] => i ) )
            [1] => Array ( [Title] => MongoRegex Object ( [regex] => g [flags] => i ) ) 
        )
        [1] => Array 
        ( 
            [0] => Array ( [Title] => MongoRegex Object ( [regex] => ra [flags] => i ) ) 
        ) 
    ) 
)
4

2 回答 2

2

为了进一步解释我的评论,我将告诉您有关 $and 运算符的信息:http ://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24and

您可以将其嵌套在您的第一个 $ 或制作中:

Array 
(
    [$or] => Array
    (
        [0] => Array
        (
            [$and] => Array 
            ( 
            [0] => Array ( [Title] => MongoRegex Object ( [regex] => o [flags] => i ) )
            [1] => Array ( [Title] => MongoRegex Object ( [regex] => g [flags] => i ) ) 
            )
        )
        [1] => Array 
        ( 
            [Title] => MongoRegex Object ( [regex] => ra [flags] => i ) 
        ) 
    ) 
)

像那样。您还可以在正则表达式中执行 $and 查询,这里有一些关于正则表达式语法的信息:http ://www.regular-expressions.info/refadv.html

于 2012-08-08T11:13:40.597 回答
1

不确定您必须搜索哪种类型的数据集,但您当前的方法存在一些重大限制:

如果您没有要搜索的大型数据集,上述所有注意事项可能都很好。

一些性能更高的替代方案是:

于 2012-08-08T13:01:33.110 回答