Про bizwood.ru, часть 4
Apr. 20th, 2011 10:44 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Особых новостей нет. Сегодня в базу внесётся сотое предложение. На айфоне так и не работает в сафари, зато заработало в опере-мобайл.
Завтра вечером в Москву за летающим роботом. Серьёзно )
Ну и теперь про
Поиск
Как сделать поиск, меня волновало с самого начала. Виделось три пути:
- скармливать гуглу RSS с последними предложениями (по РСС-лентам бот ходит чаще, чем просто по сайтам), а потом использовать поисковую машину гугла
- понадеяться, что гугл будет корректно индексировать – и оперативно – информацию по ссылкам с хэшбэнгами
- всё же придумать, как можно сделать нормальную индексацию и поиск без гугла
Первый путь я реализую чуть позже. Выбрался в результате третий – он сейчас и работает.
Сначала я изучил, какими запросами ищут по моей тематике – Яндекс.Директ прекрасная штука. Выяснилось, к примеру, что люди ищут практически всегда в именительном падеже, стало быть про склонения можно забыть.
То-есть, если решить вопрос синонимии (“деревянный дом” ≈ “сруб”), можно пользоваться встроенными в MySQL средствами поиска. Осталось придумать, что делать с релевантностью и как заставить MySQL искать одним простым запросом всё.
И да, я хотел такую поисковую машину, у которой только один аргумент на входе. И даже если мне надо найти что-то абсолютно точно – это тоже должен оставаться один параметр.
Осталось только подумав, скрестить в голове твиттер, bit.ly и просто поиск.
Из битли я взял эти вот идентификаторы бессмысленные типа http://bizwood.ru/#!j8a8ak8g. Это выдаст только предложения по пиломатериалам.
Из твиттера я взял возможность написать не только идентификатор (он кста хэштэг называется, не путать с хэшбэнгом, ога), а ещё и слова просто. http://bizwood.ru/#!j8a8ak8g кругляк выдаст уже только предложения по кругляку.
Ну а ссылка типа http://bizwood.ru/кругляк уже выдаст всё по кругляку, что найдётся.
Для такого поиска у меня сделана отдельная MyISAM-таблица. На них хорошо и быстро работает полнотекстовый поиск – правда с никудышной релевантностью. Ну у нас сортировка по релевантности – большей частью не дело сервера.
То-есть в этой таблице на каждую компанию, пользователя, место, предложение, статью и вообще всё, что можно адресовать этими вот хэштегами в стиле битли, есть одна запись. Она полнотекстовая и индексируется в полнотекстовом режиме.
Скажем, по ссылке http://bizwood.ru/#!bs13x8bs в таблице для поиска лежит примерно такой текст:
bs13x8bs 433gz3ku gf0zxs0x четырехкантный брус сечение 150×100 100×100 длина 2–6м сорт 0 ГОСТ 8486 материал хвойные породы усадьба дача
В начале – собственный идентификатор, ид компании и ид группы (брус). При таком хранении выборка по группе, компании, идентификатору или просто ключевому слову – дело одного очень быстрого и короткого запроса. Примерно так:
SELECT id FROM hashtable WHERE MATCH(content) AGAINST (‘строка поиска’) LIMIT x.
Этот запрос на выходе выдаёт только список объектов (типа так: bs13x8bs,vjb8jjea) результата поиска, но не сами объекты. Он ещё и поэтому очень быстрый.
В том-же запросе проверяется и доступ. Надумаю, может расскажу как организована безопасность и доступ – там две красивых идеи, сдёрнутые из двух разных моделей.
После этого сервер отдаёт клиенту ответ из этих идентификаторов. Это вот так выглядит http://bizwood.ru/getobjectsh.php?key=сруб (по ссылке голый json).
А вот выбор самих объектов идёт уже вторым запросом – по полученным идентификаторам, из основной базы.
То-есть поиск у меня двухпроходный. Это при двух-трёх запросах даёт существенный выигрыш в трафике и почти не приносит потерь скорости отклика.
Выигрыш в трафике получается буквально в несколько раз – потому что клиент может не запрашивать второй раз развернутое описание объекта. Получил в списке идентификатор – проверил, не попадалось ли это в предыдущих поисках – решил, загружать или нет.
А запросы, как правило, идут похожие. И из них треть – просто уточняющие.
Вот такой у меня быстрый полнотекстовый поиск. Осталось к нему прикрутить синонимию – это добавлять в описание объекта синонимы по словарю перед индексацией.
У этого поиска чудовищная релевантность.
В следующей части – как победить релевантность. Для тех, кто до сюда из Архангельска дочитал – пишите, позову вас посмотреть на летающего робота, как вернусь )
no subject
Date: 2011-04-20 07:44 pm (UTC)no subject
Date: 2011-04-20 08:34 pm (UTC)no subject
Date: 2011-04-21 10:54 am (UTC)А робот тот, что с айфона управляется?
no subject
Date: 2011-04-25 12:11 am (UTC)