Внимание! Форум временно закрыт. Все вопросы вы можете задать на странице MaxSite CMS в Github

Свой поисковый алгоритм: как оптимальнее?

Только для тех, кто понимает.
Аватар пользователя
MAX
Администратор
Сообщений: 3179
Зарегистрирован: 31 янв 2009, 19:02

Re: Свой поисковый алгоритм: как оптимальнее?

Сообщение MAX » 29 дек 2013, 20:58

Принак начала слова — это пробел:

% слово%

всё прекрасно работает.

Аватар пользователя
MAX
Администратор
Сообщений: 3179
Зарегистрирован: 31 янв 2009, 19:02

Re: Свой поисковый алгоритм: как оптимальнее?

Сообщение MAX » 29 дек 2013, 21:00

Кстати насчет регулярок: в MySQL есть нативное средство: http://www.mysql.ru/docs/man/String_com ... tions.html

Аватар пользователя
nicothin
Модератор
Сообщений: 521
Зарегистрирован: 09 мар 2009, 21:55

Re: Свой поисковый алгоритм: как оптимальнее?

Сообщение nicothin » 29 дек 2013, 21:04

хе-хе, не доэкспериментировал до такой записи )))
в любом случае, перед искомым словом могут быть скобки (обычные или квадратные), кавычки трех видов и проч. штуковины, делающие такой алгоритм малоэффективным.

о, а вот регулярки в mysql — самое то.
интересно, что быстрее — такие регулярки при забросах в БД или preg_match?
впрочем, что-то подсказывает, что если буду при ранжировании учитывать и факт встречаемости искомого слова, и его положение (начало слова или не начало) — это лишь улучшит алгоритм.

Аватар пользователя
MAX
Администратор
Сообщений: 3179
Зарегистрирован: 31 янв 2009, 19:02

Re: Свой поисковый алгоритм: как оптимальнее?

Сообщение MAX » 29 дек 2013, 21:26

Я считаю, что лучше всё-таки переложить работу на MySQL, пуcть даже и сложным запросом, чем после еще в php прогонять результат.

Если используются разные условия, то никто не отменял логические операторы AND, OR. Можно комбинировать и с LIKE с разными шаблонами поиска.

Аватар пользователя
nicothin
Модератор
Сообщений: 521
Зарегистрирован: 09 мар 2009, 21:55

Re: Свой поисковый алгоритм: как оптимальнее?

Сообщение nicothin » 29 дек 2013, 21:39

в данном случае, если переложить анализ регуляркой на БД, то:
1й запрос — получение записей, в которых просто есть искомое слово
2й запрос — получение только записей, в которых есть слова, начинаюиеся с искомого слова
(или одним запросом можно получить два результата? :) )
и так — несколько раз (в моем случае — 4 раза) — +4 запроса к БД, +замедление (4 регулярки в запросах)

а если просто получить все записи, в которых встречается слово, а потмо средствами php анализировать — примерно то же, но без +4 запросов.

Аватар пользователя
MAX
Администратор
Сообщений: 3179
Зарегистрирован: 31 янв 2009, 19:02

Re: Свой поисковый алгоритм: как оптимальнее?

Сообщение MAX » 29 дек 2013, 21:48

Сложно что-то посоветовать... Если речь о морфологии (то ради чего всё и делается), то написать запрос, но по известным правилам — не проблема. Пусть он и будет достаточно большим. Если средствами sql этого сделать нельзя, то я с трудом представляю как поиск будет построен на регулярках. Ведь в этом случае нужно получить не просто все записи, но и все их тексты, которые после и прогонять по куче циклов, условий и прочих строковых преобразований.

Могу сказать одно — лучше переложить запросы на MySQL — как минимум у него свой кеш запросов и присутствует оптимизация. Если делать на php, то это очень сложная для него обработка, которая будет сильно грузить сервер.

Для начала, я бы всё-таки сделал блок схему того, как это все должно работать в виде общего алгоритма, а уже после посмотреть что отдать на откуп базы, а что можно на php повесить.

Аватар пользователя
nicothin
Модератор
Сообщений: 521
Зарегистрирован: 09 мар 2009, 21:55

Re: Свой поисковый алгоритм: как оптимальнее?

Сообщение nicothin » 29 дек 2013, 22:01

сейчас схема простая.
к примеру, для заголовков:
1. получаю все записи, в заголовках которых (в любом месте) встречается стеммированное (без окончания и суффикса) слово. в получаемых данных — id записи и текст заголовка (поисковое слово — минимум три буквы, так что результатов не должно быть слишком много)
делается запросом с LIKE %слово%
2. обхожу полученный массив, для каждого элемента регуляркой проверяю — совпадение в начале слова (или начале данных)? если да — запоминаю этот факт, буду использовать в последующем ранжировании.

Аватар пользователя
MAX
Администратор
Сообщений: 3179
Зарегистрирован: 31 янв 2009, 19:02

Re: Свой поисковый алгоритм: как оптимальнее?

Сообщение MAX » 29 дек 2013, 22:18

Не уловил — если в первом шаге мы уже получили записи с нужным вхождением, зачем второй шаг?

Аватар пользователя
nicothin
Модератор
Сообщений: 521
Зарегистрирован: 09 мар 2009, 21:55

Re: Свой поисковый алгоритм: как оптимальнее?

Сообщение nicothin » 29 дек 2013, 22:21

я исхожу из того, что за 1 запрос я не могу получить такие данные, которые смог бы разложить на:
1. слово просто встречается в заголовке
2. слово встречается в начале слов (или в начале данных) в заголовке

сейчас думал-думал, и решил забить на п. 1.
буду использовать регулярку в запросе, искать только вхождения в начале слов.

REGEXP '([[:<:]]|«)(Т|т)ем' — вот к такой регулярке пришел
(начало слова или кавычка) — в том числе, начало слова в начале данных, перед словом могут быть скобки (простые, квадратные, фигурные), собака, двойная или одинарная кавычка и еще некоторые символы
(ЗАГЛАВНАЯ|строчная) первые буквы — не нашел как сделать поиск по мультибайтовой кодировке регистронезависимым.

Аватар пользователя
MAX
Администратор
Сообщений: 3179
Зарегистрирован: 31 янв 2009, 19:02

Re: Свой поисковый алгоритм: как оптимальнее?

Сообщение MAX » 30 дек 2013, 00:11

По-идее поиск MySQL регистронезависим изначально. Главное чтобы кодировка базы бала юникодовская.


Вернуться в «if (!is_type('Programmer')) die('not for you');»

Кто сейчас на форуме

Пользователь просматривает форум: нет зарегистрированных пользователей

cron