1

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 ) ) 
        ) 
    ) 
)
4

2 に答える 2

2

私のコメントをさらに説明するために、$and 演算子について説明します: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24and

これを最初の $or 作成内にネストできます。

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 に答える