full text search в mongo

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
koras
Сообщения: 10
Зарегистрирован: 2015.04.16, 02:02

full text search в mongo

Сообщение koras »

Пересмотрел кучу мануала и ничего не нашёл.
Стоит задача сделать полнотекстовый поиск с пагинацией с базой mongo.

Полноценно поиск, без полноценного поиска и пагинацией реализовал, но как то просмотрел что реализация именно полнотекстового поиска после добавления индекса проходит иначе чем просто поиск и выполняется через команду
Так работает в консоли

Код: Выделить всё

db.products.runCommand("text",{search:'привет'});
 
Как мне интегрировать всё это в yii2 + к этому есть дополнительные условия.
Сейчас код примерно такой:

Код: Выделить всё


        $category = new Category;
        $model_category = $category -> getcategory();
        
        $model = new Products; 
        $model -> section = Yii::$app -> request -> get('section');
        $model -> text = Yii::$app -> request -> get('text');
        $model -> price_min = (int) Yii::$app -> request -> get('price_min', 0);
        $model -> price_max = (int) Yii::$app -> request -> get('price_max', 10000000);
         
        $menu = $category -> building_tree($model -> section);
        if ($model -> price_min != 0){
            $price['price.cost'] = ['$gt' => $model -> price_min ];
            }
        if ($model -> price_max != 0)
            $price['price.cost'] = ['$lt' => (int)$model -> price_max,'$gt' => $model -> price_min];
            
        $price['price.cost'] = ['$lt' => (int)$model -> price_max,'$gt' => $model -> price_min];
        $categorys = ['category.id' => ['$in' => $category -> node_element_array]];
         
        $text_title = ['item_name' => ['$regex' => '.*' . $model -> text . '.*', '$options' => '$is']];
        $text_property = ['property.description' => ['$regex' => '.*' . $model -> text . '.*', '$options' => '$is']];
      
    
        $query = $model->find()
          
          
        -> Where($text_title)
        -> orWhere($text_property)
        -> andwhere($categorys)
        -> andwhere($price)
        -> orderBy('item_name ASC');

 
        
        $countQuery = clone $query;
        $pages = new Pagination(['totalCount' => $countQuery -> count()]);
        $model_page = $query -> offset($pages -> offset) -> limit($pages -> limit) -> all();
Код пока грязный.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: full text search в mongo

Сообщение astronin »

создать индекс
db.products.createIndex( { item_name: "text" } )
почитать, так же
http://docs.mongodb.org/manual/tutorial ... le-fields/

должно быть примерно так, для item_name

Код: Выделить всё

        $text_title = ['$text' => ['$search' => $model->text]];
и почитать как пользоваться индексом
http://docs.mongodb.org/manual/core/index-text/
http://docs.mongodb.org/manual/referenc ... uery/text/
koras
Сообщения: 10
Зарегистрирован: 2015.04.16, 02:02

Re: full text search в mongo

Сообщение koras »

Код: Выделить всё

> db.products.getIndexes()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "ns" : "products.products",
        "name" : "_id_"
    },
    {
        "v" : 1,
        "key" : {
            "_fts" : "text",
            "_ftsx" : 1
        },
        "ns" : "products.products",
        "name" : "item_name_text_property.description_text",
        "weights" : {
            "content" : 10,
            "item_name" : 1,
            "keywords" : 5,
            "property.description" : 1
        },
        "default_language" : "russian",
        "language_override" : "language",
        "textIndexVersion" : 1
    }
]
> 
Был создан сразу, изначально
koras
Сообщения: 10
Зарегистрирован: 2015.04.16, 02:02

Re: full text search в mongo

Сообщение koras »

Сделал как вы описали

Код: Выделить всё

    
      $text_search = [ '$text' =>  ['$search' =>  $model -> text  ]];
        $query = $model->find()
         -> Where($text_search )
        -> andwhere($categorys)
        -> andwhere($price)
        -> orderBy('item_name ASC');

            

Код: Выделить всё

MongoDB Exception – yii\mongodb\Exception
Cannot run command count(): exception: invalid operator: $search
↵
Caused by: MongoException
Cannot run command count(): exception: invalid operator: $search

in /var/www/.../www/vendor/yiisoft/yii2-mongodb/Query.php at line 233

Код: Выделить всё

in /var/www/.../www/vendor/yiisoft/yii2-mongodb/Query.php
        Yii::info($token, __METHOD__);
        try {
            Yii::beginProfile($token, __METHOD__);
            # line 233
            $result = $cursor->count();
            Yii::endProfile($token, __METHOD__);
 
            return $result;
        } catch (\Exception $e) {
            Yii::endProfile($token, __METHOD__);
            throw new Exception($e->getMessage(), (int) $e->getCode(), $e);
        }
    } 
koras
Сообщения: 10
Зарегистрирован: 2015.04.16, 02:02

Re: full text search в mongo

Сообщение koras »

Может быть причиной что mongo 2.4 ?
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: full text search в mongo

Сообщение astronin »

ну да, попробуйте, смотрите же по документации

$text_search = [ 'text' => ['search' => $model -> text ]];
koras
Сообщения: 10
Зарегистрирован: 2015.04.16, 02:02

Re: full text search в mongo

Сообщение koras »

Так уже пробовал.

Код: Выделить всё

$text_search = [ 'text' => ['search' => $model -> text ]]; 
Не работает.

Сейчас обновлюсь и попробую до 3.0 и попробую снова.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: full text search в mongo

Сообщение astronin »

3 не надо, она еще не полностью поддерживается php и др., лучше 2.6 пока

а что собственно не работает?
koras
Сообщения: 10
Зарегистрирован: 2015.04.16, 02:02

Re: full text search в mongo

Сообщение koras »

Не работает полнотекстовый поиск в yii2
Не успел обновиться , уехал с работы
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: full text search в mongo

Сообщение astronin »

а если в консоле то работает?
и как определяете, что не работает, результаты не возвращает или что? что показывает debugger в низу страницы?
обновитесь до 2.6 и попробуйте еще раз
koras
Сообщения: 10
Зарегистрирован: 2015.04.16, 02:02

Re: full text search в mongo

Сообщение koras »

Сперва поставил 3.03, но там много ошибок в самом mongo
Потом перестановил на 2.9, всё работает.

Код: Выделить всё

$text_search = [ '$text' => ['$search' =>  $model -> text  ]]; 
В консоли

Код: Выделить всё

db.products.find({$text: { $search: 'пейзаж'}}) ; 
Ответить