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