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

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

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

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

Сообщение nicothin » 25 дек 2013, 15:42

Пишу собственный поисковый алгоритм для MaxSite:
поиск по заголовкам и тексту записей, поиск по названиям категорий и по метаданным (теги и доп. поля записей).
Выводить буду только поток записей (предварительно их ранжируя в соответствии с неким алгоритмом (пример: одно из поисковых слов встречается в названии рубрик записи — это + 50 к рейтингу, и т.п.))

Вопрос: как оптимальнее сделать? Пока, два варианта:
1. получить ВСЕ записи (а их может быть под 2000) и фильтровать/ранжировать элементы полученного массива
2. извращение:
- получить записи стандартным поисковым средством MaxSite и вычленить их ID,
- получить совпадения в рубриках и получить все записи тех рубрик, в названии которых встречены поисковые слова (тоже вычленить ID),
- то же самое с тегами и метаданными,
- слить получившиеся массивы → имеем все ID подходящих страниц
- получаем страницы с указанными ID, ранжируем их последовательность, выводим

Логика подсказывает, что вариант 2 — существенно затратнее по времени, но вариант 1, вроде бы, затратнее по памяти (если записей более 2000).

Аватар пользователя
searchingman
Модератор
Сообщений: 1392
Зарегистрирован: 28 май 2012, 16:02

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

Сообщение searchingman » 25 дек 2013, 16:11

Что мешает посмотреть оба алгоритма через профилировщик и выбрать более оптимальный?

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

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

Сообщение nicothin » 25 дек 2013, 16:30

длительность написания, недостаток знаний о работе с профилировщиком (и отсутствие оного) и всего 17 записей в таблице page.

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

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

Сообщение MAX » 25 дек 2013, 17:14

Конечная цель нового посика? Чем он будет отличаться от стандартного?

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

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

Сообщение nicothin » 25 дек 2013, 17:31

- поиском по метаданным
- возможностью ранжировать результат в зависимости от встречаемости поисковых слов в тексте записи, метках, названиях рубрик, метаданных записей
- возможностью ранжировать результат в зависимости от рейтинга станицы и пометки «выбор редакции»

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

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

Сообщение MAX » 25 дек 2013, 17:58

Всё упрётся в использовании в sql-запросах LIKE. То есть делается запрос к одной таблице, второй, третьей и т.п. — получается список id записей/рубрик/итд Дальше уже ранжируется. Но, из-за LIKE не получится сделать корректную выборку поскольку не используется морфология.

Если делать «как положено», то в более-менее «простом» варианте схема бдет такая:
— запускается индексация записей, рубрик и всего того по чему ужно осуществлять поиск. В результате составляется таблица вхождений слов.
— делается морфология, где каждое слово склоняется по правилам русского языка, суффиксы, приставки, корни и т.д.. Все слова приводятся к некоей «исходной» форме (именительный падеж, ед. число и т.д.)
— составляются таблицы синонимов для каждого слова.

Теперь поисковая фраза перед тем, как делается непосредственно поиск, приводится к «исходной» форме и уже по ней происходит выборка из подготовленной поисковой базы. Вначале по основному слову, после все словоформы. Получается список записей/рубрик/меток, которые и отдаются как результат поиска.

Для двойных/тройных фраз поисковый индекс еще больше усложняется.

Существуют разные алгоритмы, позволяющие упростить составляение поискового индекса. Например вначале делается таблицы всех (по возможности) слов со всеми словоформами. После по ним прогоняется база записей и формируется эдакий «индекс вхождения». По ним уже и делается выборка.

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

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

Сообщение nicothin » 25 дек 2013, 18:09

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

на заданный вопрос, я так понимаю, ответа быть не может.
единственный вариант — проверять на большом кол-ве записей.

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

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

Сообщение MAX » 25 дек 2013, 19:30

Я думаю, что если делать какой-то простой вариант, то это ограничения из-за LIKE. То есть фактически мало чем отличается от стандартного. Если делать поисковый индекс, то это очень затратно для сервера...

Если конечно интересно, то попробуйте какой-нибудь вариант сделать, но я думаю, что без морфологии овчинка не будет стоить выделки. Можно попробовать поискать какие-то готовые поисковые движки или даже парсить запросы к гуглу/яндексу. Наверное у них есть какое-то api для этого дела.

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

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

Сообщение nicothin » 26 дек 2013, 03:11

подумываю, сделать так:
с морфологией разобраться стеммером Портера (с отсечением всякого хлама, типа «когда», «однако», «для» и пр. и с правками результата его работы, ибо небезгрешен), т.к. со словарями — серьезная нагрузка на сервер (у меня виртуальный хостинг);

то есть, после стеммера получаю сокращенное слово, без окончания и суффикса — его и буду искать — сначала в записях (видимо, отдельно в заголовках и отдельно в текстах), потом в рубриках и в метаданных. на выходе поиска — ID записей, которые ранжирую и получаю их mso_get_pages().
(на самом деле, получаю каждое слово поиска сокращенным и каждое буду так искать. ограничу поиск двумя словами, я думаю)

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

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

Сообщение MAX » 26 дек 2013, 11:45

Я немного сомневаюсь, но всё-равно было бы интересно посмотреть на такие словопреобразования.


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

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

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

cron