2012-08-08 82 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