2012-08-08 137 views
1

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

输入字符串中的空格表示'和'运算符和|或管道字符是'或'运算符。 输入查询的变化,但可能是沿着这些路线的东西(减去引号!):

'o g|ra' 

这将相当于写:

(o&&g)||(ra) 

基本蒙戈查询(请注意,我不是试图每次都翻译这个确切的查询,我需要它在$ 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的$或者不喜欢接受一个数组,我只是不确定如何重新使用搜索算法来解决这个问题。

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)) 
     ) 
    ) 
) 
+0

您可以翻转第一个$和正则表达式来使用组来检测$和或者您可以使用实际的$和操作符。 – Sammaye 2012-08-08 11:09:29

回答

2

为了说明我的意见进一步,我会告诉你的$和运营商: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) 
     ) 
    ) 
) 

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

+0

谢谢,似乎这个变化正常工作。 – jjcohen 2012-08-08 13:07:20

1

不知道什么样的数据的语料库,你必须搜寻,但也有与你目前的做法有些显著的局限性:

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

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

+0

+1重要信息要考虑 – Sammaye 2012-08-08 13:14:08

+0

非常感谢您的额外想法。 这不是一个很大的语料库,而且应用程序似乎很快就会表现出色。不幸的是,区分大小写和生成标签并不是真正的选择。 关于相关性和订购我打算做客户端(使用JavaScript),以便用户可以实际指定他们如何看到结果,这为返回提供了更多的灵活性(用户)。 – jjcohen 2012-08-10 09:44:40