mongodb を使用して基本的な検索エンジンを構築しています。基本的なクエリが mongo シェルで動作することを確認しました。ただし、これをどのようにPHPに変換できるかはよくわかりません。
入力文字列内のスペースは、「and」演算子および | を意味します。またはパイプ文字は「or」演算子です。入力クエリは変更されますが、次の行に沿ったものになる可能性があります (引用符を除く):
'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 ) )
)
)
)