【问题标题】:MongoRegex and search multiple rows in collectionMongoRegex 并在集合中搜索多行
【发布时间】:2012-07-01 11:44:42
【问题描述】:

我想做的是以下。

$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" )),
        )));

【问题讨论】:

    标签: php json mongodb search


    【解决方案1】:

    对于任何想知道我最终如何让它工作的人。这很简单。我仍在努力,但这是我目前所拥有的。

    $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);
    

    【讨论】:

    • 根据您计划添加的数据量,我怀疑性能很快就会成为问题。多个(和非锚定的)正则表达式将不使用索引。请参阅notes on Regular Expressions。更好的方法是使用Full Text Search approach 对照提取的关键字列表为您的文档编制索引,或者使用提供更丰富的搜索功能和相关性评分的全文搜索引擎。
    猜你喜欢
    • 2021-02-26
    • 2019-08-02
    • 2013-12-02
    • 1970-01-01
    • 2013-01-11
    • 2014-07-31
    • 2019-03-10
    • 1970-01-01
    • 2021-04-17
    相关资源
    最近更新 更多