Полнотекстовый индекс

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
lavrik
Сообщения: 110
Зарегистрирован: 2013.03.02, 21:41
Контактная информация:

Полнотекстовый индекс

Сообщение lavrik »

Хочу организовать поиск, запросом например:

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

SELECT 
    * 
FROM 
    Items 
WHERE MATCH (name, model) AGAINST ("test")
Попробовал выполнить его через консоль - ошибка:
#1214 - The used table type doesn't support FULLTEXT indexes

Нужен полнотекстовый индекс.
Вопрос: как через миграции его создать? в createIndex() нет даже параметра!!!
lavrik-v.ru - моя напоминалка по php.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Полнотекстовый индекс

Сообщение vitalik1183 »

Использовать Sphinx
Yii2!
lavrik
Сообщения: 110
Зарегистрирован: 2013.03.02, 21:41
Контактная информация:

Re: Полнотекстовый индекс

Сообщение lavrik »

я его так и не смог поднять под openServer-ом
да и вообще, в моем случае это из "пушки по воробьям"...
Подумал и решил что обычного createCommand()-а будет достаточно.
lavrik-v.ru - моя напоминалка по php.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Полнотекстовый индекс

Сообщение vitalik1183 »

я его так и не смог поднять под openServer-ом
да я поднимал на винде - нормальный полет.
ну если из пушки по воробьям, то подозреваю что вам и LIKE простого будет достаточно ;)
Yii2!
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Полнотекстовый индекс

Сообщение zelenin »

lavrik писал(а):я его так и не смог поднять под openServer-ом
да и вообще, в моем случае это из "пушки по воробьям"...
Подумал и решил что обычного createCommand()-а будет достаточно.
то есть ставить левый опенсервер не из пушки, а сфинкс поставить - да? в чем разница?
lavrik
Сообщения: 110
Зарегистрирован: 2013.03.02, 21:41
Контактная информация:

Re: Полнотекстовый индекс

Сообщение lavrik »

обожаю программистов!
Задашь вопрос, все кинутся тебе доказывать что тебе это не надо...

Вопрос ведь простой: Как через миграции создать FULLTEXT индекс?
Или вообще, возможно ли это?
lavrik-v.ru - моя напоминалка по php.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Полнотекстовый индекс

Сообщение vitalik1183 »

lavrik вы услышали умное слово и решили здесь потрепаться.
во первых фулиндекс работает только в MyISAM вы такой инфы не указали, у вас такой тип таблиц стоит ?
во вторых тема полнотекстового поиска это отдельная вещь любого проекта а вы тут решили в команде миграции чудо изобразить.
Yii2!
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Полнотекстовый индекс

Сообщение zelenin »

lavrik писал(а):обожаю программистов!
Задашь вопрос, все кинутся тебе доказывать что тебе это не надо...
потому что сообщество нужно для развития его составляющих. Задавший вопрос в большинстве случаев не может сделать адекватный выбор инструмента, и в задачу "старшего" товарища входит в том числе подсказать в чем он ошибается.
lavrik писал(а):Вопрос ведь простой: Как через миграции создать FULLTEXT индекс?
Или вообще, возможно ли это?
в пользу моего тезиса служит то, что ошибка читаема и гуглится. У вас же не хватило квалификации, чтобы найти объяснение своей ошибки по первой же ссылке из гугла.

Я в чем-то не прав?
Если вы не поняли, о чем я пишу, поясню: вам уже ответили на ваш вопрос - вам осталось его прочесть.
lavrik
Сообщения: 110
Зарегистрирован: 2013.03.02, 21:41
Контактная информация:

Re: Полнотекстовый индекс

Сообщение lavrik »

сфинкс так сфинкс...
lavrik-v.ru - моя напоминалка по php.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Полнотекстовый индекс

Сообщение vitalik1183 »

ну вот, другое дело :)
Yii2!
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Полнотекстовый индекс

Сообщение zelenin »

lavrik писал(а):сфинкс так сфинкс...
а вот это поспешно. мы же не знаем че там у вас. может вы учебный проект делаете.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Полнотекстовый индекс

Сообщение vitalik1183 »

а вот это поспешно. мы же не знаем че там у вас. может вы учебный проект делаете.
ну и что, блеснет в универе перед аудиторией инновациями :)
Yii2!
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Полнотекстовый индекс

Сообщение rugabarbo »

vitalik1183 писал(а):
а вот это поспешно. мы же не знаем че там у вас. может вы учебный проект делаете.
ну и что, блеснет в универе перед аудиторией инновациями :)
Схватит двойку в дневник за то, что сделал не по методичке :mrgreen:
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Полнотекстовый индекс

Сообщение vitalik1183 »

да ладно. может тс вовсе не студент :)
Yii2!
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Полнотекстовый индекс

Сообщение vitalik1183 »

ну не юзал я ни разу сфинкс, и что такого?
вам никто ничего и не говорит нащет етого
Yii2!
lavrik
Сообщения: 110
Зарегистрирован: 2013.03.02, 21:41
Контактная информация:

Re: Полнотекстовый индекс

Сообщение lavrik »

если тут ещё кто-то есть, спрошу...
Запилил я сфинкс, вроде работает, вроде нормально...
Поиск делаю так:

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

// $search  -  тут строка поиска
        $match = Yii::$app->sphinx->escapeMatchValue($search);
        $query = new \yii\sphinx\Query;
        
        $QUERY = $query
            -> select('id, vendor, price, name, model')
            -> from('Items')
            -> where(['if_show' => 1])
            -> limit(500)
            -> match(new \yii\db\Expression(':match', ['match' => '@(model) '.$match .' | '.'@(name) '.$match]));
        $RESULT    =    $QUERY -> all();
 
В $search у меня слово для поиска. Но что делать если у меня в $search 2 слова? Ничего не находит.
И гугл ничего не дал(((
lavrik-v.ru - моя напоминалка по php.
Аватара пользователя
Йож
Сообщения: 574
Зарегистрирован: 2015.08.26, 03:05

Re: Полнотекстовый индекс

Сообщение Йож »

У Вас в $search, когда два слова - они чем разделены? Попробуйте | и звездочки по краям каждого слова:
*красн*|*помидор* (можно и без звездочек наверно, не проверял)
lavrik
Сообщения: 110
Зарегистрирован: 2013.03.02, 21:41
Контактная информация:

Re: Полнотекстовый индекс

Сообщение lavrik »

Йож писал(а):У Вас в $search, когда два слова - они чем разделены? Попробуйте | и звездочки по краям каждого слова:
*красн*|*помидор* (можно и без звездочек наверно, не проверял)
Заработало без звездочек, НО только после того как я убрал из поиска model:

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

        $match = Yii::$app->sphinx->escapeMatchValue( str_replace(' ', '|', $search) );
        $query = new \yii\sphinx\Query;
        
        $QUERY = $query
            -> select('id, vendor, price, name, model')
            -> from('Items')
            -> where(['if_show' => 1])
            -> limit(500)
            -> match(new \yii\db\Expression(':match', ['match' => '@(name) '.$match]));
 
но стоит добавить model:

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

-> match(new \yii\db\Expression(':match', ['match' => '@(name) '.$match.' | @(model) '.$match ]));
 
перестает искать...
Что не так?
lavrik-v.ru - моя напоминалка по php.
lavrik
Сообщения: 110
Зарегистрирован: 2013.03.02, 21:41
Контактная информация:

Re: Полнотекстовый индекс

Сообщение lavrik »

lavrik писал(а):
Йож писал(а):У Вас в $search, когда два слова - они чем разделены? Попробуйте | и звездочки по краям каждого слова:
*красн*|*помидор* (можно и без звездочек наверно, не проверял)
Заработало без звездочек, НО только после того как я убрал из поиска model:

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

        $match = Yii::$app->sphinx->escapeMatchValue( str_replace(' ', '|', $search) );
        $query = new \yii\sphinx\Query;
        
        $QUERY = $query
            -> select('id, vendor, price, name, model')
            -> from('Items')
            -> where(['if_show' => 1])
            -> limit(500)
            -> match(new \yii\db\Expression(':match', ['match' => '@(name) '.$match]));
но стоит добавить model:

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

-> match(new \yii\db\Expression(':match', ['match' => '@(name) '.$match.' | @(model) '.$match ]));
перестает искать...
Что не так?
Разобрался. Дело в скобках! нужно было обернуть все в скобки:

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

-> match(new \yii\db\Expression(':match', ['match' => '(@(name) '.$match.') | (@(model) '.$match.') | (@(vendor) '.$match.')' ]));
 
lavrik-v.ru - моя напоминалка по php.
Ответить