Организация поиска по сайту

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
eche
Сообщения: 36
Зарегистрирован: 2012.05.13, 11:50

Организация поиска по сайту

Сообщение eche »

Всем привет! Делаю поиск по сайту, и возник такой вопрос, что лучше, правильнее и самое главное производительнее like или fulltext+phpMorphy. Морфология не очень критично, поэтому подумываю о стеммере портера. В общем подскажите кто чем пользуется и как более правильно организовать поиск?
PixoiD
Сообщения: 111
Зарегистрирован: 2009.09.25, 10:14

Re: Организация поиска по сайту

Сообщение PixoiD »

sphinx))) зачем еще что-то придумывать)
Сила аргументов, аргументы силы!
Аватара пользователя
RSol
Сообщения: 325
Зарегистрирован: 2010.05.07, 08:36
Откуда: Северодонецк, Украина
Контактная информация:

Re: Организация поиска по сайту

Сообщение RSol »

eche писал(а):Всем привет! Делаю поиск по сайту, и возник такой вопрос, что лучше, правильнее и самое главное производительнее like или fulltext+phpMorphy. Морфология не очень критично, поэтому подумываю о стеммере портера. В общем подскажите кто чем пользуется и как более правильно организовать поиск?
Правильней использовать что-то типа Sphinx. :-)

Посмотрел phpMorphy - интересный зверь. Набросал обертку для Yii. Использование:

0. Копируем в ext. В папку "vendor/dicts" копируем нужные словари.

1. Подключаем в конфиге:

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

'components'=>array(
...
        'morphy'=>array(
            'class'=>'ext.phpMorphy.RMorphy',
        ),
...
),
 
2. Использование в коде

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

$roots = Yii::app()->morphy->getPseudoRoot(array('КУПЛЮ','КВАРТИРУ','УБИТУЮ','БЕЗ','РЕМОНТА')); 
Даст:

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

array
(
    'УБИТУЮ' => array
    (
        '0' => 'УБИТ'
        '1' => 'УБ'
    )
    'РЕМОНТА' => array
    (
        '0' => 'РЕМОНТ'
    )
    'КУПЛЮ' => array
    (
        '0' => 'КУП'
    )
    'КВАРТИРУ' => array
    (
        '0' => 'КВАРТИР'
    )
    'БЕЗ' => array
    (
        '0' => 'БЕЗ'
    )
) 

После указанного теста, мне кажется использование его для поиска... не очень.
Вложения
phpMorphy.zip
(148.88 КБ) 257 скачиваний
eche
Сообщения: 36
Зарегистрирован: 2012.05.13, 11:50

Re: Организация поиска по сайту

Сообщение eche »

PixoiD писал(а):sphinx))) зачем еще что-то придумывать)
Согласен, но хостинг виртуальный и сервера пока не предвидится :(
eche
Сообщения: 36
Зарегистрирован: 2012.05.13, 11:50

Re: Организация поиска по сайту

Сообщение eche »

После указанного теста, мне кажется использование его для поиска... не очень.
А можно поподробнее, почему не очень?
Аватара пользователя
RSol
Сообщения: 325
Зарегистрирован: 2010.05.07, 08:36
Откуда: Северодонецк, Украина
Контактная информация:

Re: Организация поиска по сайту

Сообщение RSol »

eche писал(а): А можно поподробнее, почему не очень?
А какой запрос Вы сформируете на основе этих данных?
eche
Сообщения: 36
Зарегистрирован: 2012.05.13, 11:50

Re: Организация поиска по сайту

Сообщение eche »

Например, делаю таблицу в которую вношу эти данные и id записи, которой они соответствуют.
А дальше что то вроде
SELECT * FROM ... WHERE MATCH (...) AGAINST (...);
Аватара пользователя
RSol
Сообщения: 325
Зарегистрирован: 2010.05.07, 08:36
Откуда: Северодонецк, Украина
Контактная информация:

Re: Организация поиска по сайту

Сообщение RSol »

Для указанных данных предложите, что сюда вставить:
eche писал(а):AGAINST (...);
eche
Сообщения: 36
Зарегистрирован: 2012.05.13, 11:50

Re: Организация поиска по сайту

Сообщение eche »

УБ РЕМОНТ КУП КВАРТИР БЕЗ или КВАРТИР или РЕМОНТ. В общем зависти от того, что пользователь ввел в строку поиска
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Организация поиска по сайту

Сообщение samdark »

Когда-то в словарях morphy были склонения русского слова Друпал :) Особенно нравилася форма «Друпало». Эдакое ругательство.
eche
Сообщения: 36
Зарегистрирован: 2012.05.13, 11:50

Re: Организация поиска по сайту

Сообщение eche »

Хы, друпало)))) И в продолжение темы еще вопрос. В форме для поиска есть 6 полей, в зависимости от того какие поля заполнены формируются разные запросы в БД. Но как проверять какие поля заполнены, а какие нет первым приходит на ум

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

if(empty(поле1) &&...&&empty(поле 6) )
{
все поля пустые
}
if(!empty(поле1) &&...&&empty(поле 6) ){
поле1 не пустое
}
 
и т.д. но такой способ очень громоздкий... Подскажите, возможно ли это сделать как нибудь проще?
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Организация поиска по сайту

Сообщение anton44eg »

Не совсем понял вопрос, но может так?

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

$notEmptyFields = array();
foreach($fields as $field) {
if($field == '') continue;
$notEmptyFields[] = $field;
} 
eche
Сообщения: 36
Зарегистрирован: 2012.05.13, 11:50

Re: Организация поиска по сайту

Сообщение eche »

Суть вопроса немного в другом. в форме для поиска квартиры есть поля город, улица, количество комнат, цена от, цена до ну и естественно строка поиска. Теперь пример, человек при поиске указал город в котором хочет найти квартиру , указал улицу, но не указал количество комнат и цену. Отправил форму, я получил данные и теперь нужно выбрать из базы квартиры в которых в описании встречается, то что пользователь ввел в строке поиска причем эти квартиры должны быть указанном городе на указанной улице. т.е в запросе к БД мне нужно указать конкретное поле в котором нужно искать эти значения. Я не знаю заранее какие поля заполнит юзер поэтому я не могу сформировать запрос...единственное решение которое я вижу тупой перебор заполненных полей, но получается много возможных сочетаний, например
1.указал только город
2. город и улицу
3. город и нижнюю планку цены
4. город, улицу и верхнюю планку
Ну и т.д . Вашим способом, конечно, я получу поля, но как их сопоставить с полями таблицы в БД? Надеюсь понятно объяснил
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Организация поиска по сайту

Сообщение anton44eg »

Да, понятно. Я бы использовал CFormModel. Написал бы функцию, которая проходилась бы по аттрибутам и, если аттрибут задан, добавляла condition к запросу.
eche
Сообщения: 36
Зарегистрирован: 2012.05.13, 11:50

Re: Организация поиска по сайту

Сообщение eche »

Думал об этом, но запрос будет вида SELECT * FROM ... WHERE MATCH (...) AGAINST (...) AND city='1' AND ... AND... ;
И здесь http://www.yiiframework.com/doc/api/1.1/CDbCriteria подобной конструкции MATCH (...) AGAINST (...) не нашел
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Организация поиска по сайту

Сообщение anton44eg »

Мне кажется с запросом такой сложности нужно не CDbCriteria использовать. Либо расширить его можно.
eche
Сообщения: 36
Зарегистрирован: 2012.05.13, 11:50

Re: Организация поиска по сайту

Сообщение eche »

anton44eg писал(а):Мне кажется с запросом такой сложности нужно не CDbCriteria использовать.
Я тоже так думаю , собственно вопрос поэтому и возник...
eche
Сообщения: 36
Зарегистрирован: 2012.05.13, 11:50

Re: Организация поиска по сайту

Сообщение eche »

Перебрал все возможные сочетания получилось ~50 if -ов. Неужели нет другого способа?
Skiller
Сообщения: 627
Зарегистрирован: 2011.11.27, 00:21

Re: Организация поиска по сайту

Сообщение Skiller »

eche писал(а):Перебрал все возможные сочетания получилось ~50 if -ов. Неужели нет другого способа?
немного не понял, 50 ифов условий выборок? там же вроде про "квартиры" меньше было, нет? CDBCommandBuilder может помочь тоже в некотором смысле, когда будешь подцеплять запросы в зависимости от условий.
eche
Сообщения: 36
Зарегистрирован: 2012.05.13, 11:50

Re: Организация поиска по сайту

Сообщение eche »

ага более 50 условий. 6 полей в форме вот и получается столько возможных сочетаний и яя не уверен что учел все возможные сочетания. CDBCommandBuilder а вот это кажется то, что нужно, сейчас проверю
Ответить