[PHP, MySQL] система поиска в БД по ключевым словам
Сам использую Tsearch2 для PostgreSQL, хорошая штука, работает.
http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/
А твой движок вкратце что умеет? И портировать его на MySQL вообще реально? (Естественно, портировать будем мы, если реально).
А твой движок вкратце что умеет?Лучше скопирую кусок, тут лучше написано:
tsearch2 - реализация полнотекстового поискаДля поддержки различных языков там используются ispell'овские словари. С небольшими документами работает быстро (насколько это слово применимо к PostgreSQL он у нас индексирует e-mail'ы.
Этот модуль предназначен для организации полнотекстового поиска в БД. Его отличительной особенностью является online-индекс и полная интеграция с БД, что дает возможность проводить полнотекстовый поиск с ограничениями по атрибутам. Например, искать по документам, в зависимости от уровня доступа клиента и дате публикации. Tsearch2 поддерживает использование словарей, предоставляет API для их создания. Поддержка словарей популярных форматов ispell (для приведения слов к их нормальной форме) и стемминга на основе snowball позволяет использовать tsearch2 со многими языками. Гибкость настройки tsearch2, конфигурация которого хранится в базе данных и доступна с помощью стандартных команд SQL, позволяет разрабатывать различные поиски ориентированные на разные задачи. Модуль предоставляет два вида ранжирующих функций, использующие координатную информацию, и которые можно использовать для сортировки результатов поиска по их релевантности запросу.
С модулем tsearch2 полнотекстовый поиск становится простой и рутинной задачей. Пример поиска документов, которые содержат слова 'собака', 'на', 'сене':
SELECT mid, title from messages where
ftsindex @@ to_tsquery('собака & на & сене');
Аналогично, но ищутся 10 самых релевантных запросу документов:
SELECT mid, title, rank(ftsindex,to_tsquery('собака & на & сене' as rank
from messages where
ftsindex @@ to_tsquery('собака & на & сене')
ORDER BY rank DESC LIMIT 10;
Модуль поддерживает структурность документа, т.е. словам из разных частей документа (всего можно использовать 4 части) можно задавать разные веса. Так, например, вес слова, входящего в название документа, можно увеличить, по сравнению с другими частями. Также, можно ограничивать поиск по различным частям документов, используя один и тот же индекс. В примере ниже, поле ftsindex включает поле title и тело документа.
UPDATE messages SET ftsindex=setweight( to_tsvector(title 'A' ) ||
to_tsvector(body);
Можно поискать только по названиям документов:
SELECT mid, title FROM messages WHERE
ftsindex @@ to_tsquery('собака:a & на & сене');
Для визуализации результатов поиска модуль предоставляет функцию headline, которая выдает релевантные части документа с подсветкой слов из запроса.
SELECT mid, headline(body, to_tsquery('собака & на & сене'
rank(fts_index,to_tsquery('собака & на & сене' AS rank
FROM messages
WHERE ftsindex @@ to_tsquery('собака & на & сене')
ORDER BY rank DESC LIMIT 10;
Отметим, что в этом запросе, функция headline вызывается для каждого найденного документа, что может существенно влиять на время исполнения запроса. Это связано с тем как в PostgreSQL реализован LIMIT. Оптимизированный запрос с использованием подзапроса (subselect) выглядит следующим образом:
SELECT mid, headline(body, to_tsquery('собака & на & сене' FROM
(SELECT mid, body, rank(fts_index,to_tsquery('собака & на & сене' AS rank
FROM messages
WHERE
ftsindex @@ to_tsquery('собака & на & сене')
ORDER BY rank DESC LIMIT 10) AS foo;
Здесь функция headline вызывается только нужное (максимум 10) количество раз.
И портировать его на MySQL вообще реально?Плохо знаком с тем, какие возможности предоставляет для этого MySQL. Мне кажется, что будет достаточно сложно.
круто, спасибо, гляну
Оставить комментарий
Fragaria
Народ, подскажите, есть ли готовые более-менее серьёзные решения для полнотекстового поиска по базе данных?Задача: есть набор сущностей, описываемых а)ключевыми словами, б)заголовком, в)комментарием.
Написание ключевых слов формализовано, написание остальных - произвольно (по правилам русского языка).
Нужна гибкая готовая система с хорошей архитектурой, позволяющая настроить поиск сущности по заданному набору формализованных (или, что ещё лучше, не формализованных) ключевых слов.
Язык - PHP (желательно 5 база данных- MySQL>4.1.