2012-07-01 2 views
0

Что я хотел бы сделать, так это следующее.MongoRegex и поиск нескольких строк в коллекции

$collection = $this->db->products_sale; 

     $user_query = preg_replace("/[[:blank:]]+/"," ", $data); 
     $arr_query = explode(' ', $user_query); 

     if (count($arr_query) > 1) { 
     $tmp = array(); 

     foreach ($arr_query as $q) { 
      $tmp[] = new MongoRegex("/". $q ."/i"); 
     } 

     $who['keywords'] = array('$in' => $tmp); 
     $who['title'] = array('$in' => $tmp); 
     $who['description'] = array('$in' => $tmp); 

     } else { 
      $who['keywords'] = new MongoRegex("/". $user_query ."/"); 
      $who['title'] = new MongoRegex("/". $user_query ."/"); 
      $who['description'] = new MongoRegex("/". $user_query ."/"); 
     } 

     print json_encode($who); 
     $cursor = $collection->find($who); 

Как вы можете видеть, что я делаю несколько запросов, что я хотел бы сделать, это следующее мне нужно, чтобы иметь возможность искать ключевые слова, название, описание

Теперь я мог бы сделать количество поисков, что я и думал, что делаю, но явно нет. из того, что я получил, кажется, что он отправляет одну длинную строку ARRAY или JSON обратно в mongoDB, в отличие от MySQL, где вы можете выполнить поиск OR/AND и даже поиск MATCH, кажется, MongoDB просто не тот умный.

Это то, что я нашел работу, но тогда он ищет точный способ поисковых поиски например

«Windows Phone 7» получил бы искал вместо ключевых слов.

$cursor = $collection->find( 
     array('$or' => array(
     array("keywords" => new MongoRegex("/$user_query/i")), 
     array("product" => new MongoRegex("/$user_query/i")), 
     array("description" => new MongoRegex("/$user_query/i")), 
     ))); 

ответ

0

Для тех, кто хочет знать, как я оказался на работе. Это было довольно просто. Я все еще работаю над этим, но вот что я до сих пор.

$collection = $this->db->products_sale; 

    $user_query = preg_replace("/[[:blank:]]+/"," ", $data); 
    $arr_query = explode(' ', $user_query); 

    if (count($arr_query) > 1) { 
    $tmp = array(); 

    foreach ($arr_query as $q) { 
     $tmp[] = new MongoRegex("/". $q ."/i"); 
    } 

    $who['keywords'] = array('$in' => $tmp); 
    $who['product'] = array('$in' => $tmp); 

    } else { 
     $who['keywords'] = new MongoRegex("/". $user_query ."/"); 
     $who['product'] = new MongoRegex("/". $user_query ."/"); 
    } 

    //print json_encode($who); 
    $cursor = $collection->find( 
    array('$or' => array($who 
    ))); 


    if ($cursor->count() > 0) 
    { 
    //print "found you"; 
    $test = array(); 
    // iterate through the results 
    while($cursor->hasNext()) { 
     $test[] = ($cursor->getNext()); 
    } 
    print json_encode($test); 
+0

В зависимости от того, сколько данных вы планируете добавить, я подозреваю, что производительность быстро станет проблемой. Множественные (и не привязанные) регулярные выражения не будут использовать индекс. См. [Заметки о регулярных выражениях] (http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions). Лучшим подходом было бы проиндексировать ваши документы с помощью подхода [Полный поиск текста] (http://www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongo) по списку извлеченных ключевых слов или используйте полнотекстовую поисковую систему, которая обеспечит более богатые функции поиска и подсчет релевантности. – Stennie