Полнотекстовый поиск и его возможности / Хабрахабр. Многие СУБД поддерживают методы полнотекстового поиска (Fulltext search), которые позволяют очень быстро находить нужную информацию в больших объемах текста. В отличие от оператора LIKE, такой тип поиска предусматривает создание соответствующего полнотекстового индекса, который представляет собой своеобразный словарь упоминаний слов в полях. Под словом обычно понимается совокупность из не менее 3- х не пробельных символов (но это может быть изменено). В зависимости от данных словаря может быть вычислена релевантность – сравнительная мера соответствия запроса найденной информации.
Поиск По Mysql Без Учета Регистра
В статье рассказывается как работать с полнотекстовым поиском на примере БД My. SQL, а так же приведу примеры «нестандартного» использования данного механизма. В My. SQL возможности полнотекстового поиска (только для My. ISAM- таблиц) поддерживаются начиная с версии 3. В последующих версиях механизм потерпел существенные доработки и расширения, в тоге превратившись в мощное средство для создания поисковых механизмов веб- приложений. Главная особенность – быстрый поиск слов в очень больших объемах текстовой информации. Индекс FULLTEXT. Итак, чтобы работать с полнотекстовым поиском, сначала нам нужно создать соответствующий индекс.
В статье приведен простой пример поиска по колонке Название таблицы магазинов. </form>. В файле poiskmag.php - SQL-запрос к БД MySQL, обработка результатов SQL-запроса.. В MySQL возможности полнотекстового поиска (только для MyISAM-таблиц) поддерживаются начиная с версии 3.23.23. В последующих. Поиск по таблице MySql базы на PHP.
Особенности кода: Контекстный поиск отдельных слов, введенных через пробел в строке запроса.
Он называется FULLTEXT, и может быть наложен на поля CHAR, VARCHAR и TEXT. Причем, как и в случае с обычным индексом – если происходит поиск по 2- м полям, то нужен объединенный индекс 2- х полей, используйте поиск по одному полю – нужен индекс только этого поля. Например: CREATE TABLE `articles` (`id` int(1. NOT NULL auto_increment,`title` varchar(2. NULL,`body` text,PRIMARY KEY (`id`),FULLTEXT KEY `ft.
- Поиск по слову ``MySQL'' в предыдущем примере не приводит к каким-либо результатам, так как это слово присутствует более чем в половине строк.
- Сегодня мы напишем собственный поиск по сайту с использованием PHP и MySQL. Первым делом рассмотрим краткий алгоритм..
FULLTEXT KEY `ft. ENGINE=My. ISAM DEFAULT CHARSET=utf.
![Поиск По Mysql На Php Пример Поиск По Mysql На Php Пример](http://stewardshipofwealth.com/database-software-free-28.jpg)
В этом примере создается таблица с 2- мя полнотекстовыми индексами: ft. Только в поле title искать не получится.
Конструкция MATCH- AGAINST. Собственно для самого полнотекстового поиска в My.
Как сделать полнотекстовый поиск MySQL. Какой бы не казалась задача полнотекстового поиска сложной
Реализовать поиск по таблицам MySQL можно разными способами. В статье приведен простой пример поиска по колонке Название таблицы магазинов.
</form>. В файле poiskmag.php - SQL-запрос к БД MySQL, обработка результатов SQL-запроса. Безопасный и удобный поиск в mySQL. Автор: Дмитрий Лебедев. Источник: detail.phpclub.net. Краткая справка по реализации поиска : Обработка строки. Поиск mysql like. Задача сравнительно простая, но нагруженный проект. Есть поле в таблице varchar(255). В таблице много полей и.
![Поиск По Mysql Поиск По Mysql](http://www.chanhvuong.com/wp-content/uploads/mysql_sys_prefs-768x364.png)
SQL используется конструкция MATCH(filelds)… AGAINST(words). Она может работать в различных режимах, которые достаточно сильно между собой отличаются. Для всех действует следующее правило: данная конструкция возвращает условную релевантность, но способ вычисления которой может быть разным в зависимости от режима.
Еще стоит добавить что во всех режимах поиск всегда регистрозависимый. Далее более подробно о каждом из них. MATCH- AGAINST IN NATURAL LANGUAGE MODE. SELECT * FROM `articles` WHERE MATCH (title,body) AGAINST ('database'); В этом примере мы ищем слово database в полях title и body таблицы articles на основе индекса ft. Выборка будет автоматически отсортирована по релевантности – это происходит в случае указания конструкции MATCH- AGAINST внутри блока WHERE и не задано условие сортировки ORDER BY. Кстати, несмотря на возможности алиасов, при запросах конструкцию приходится повторять в разных местах, что усложняет запросы. Вот например нельзя написать так: SELECT *, MATCH (title,body) AGAINST ('database') as RELFROM `articles` WHERE REL > 0; — этот запрос выдаст ошибку: поле Rel не определено.
Что бы работало, придется продублировать данную конструкцию: SELECT *, MATCH (title,body) AGAINST ('database') as RELFROM `articles` WHERE MATCH (title,body) AGAINST ('database') > 0; Однако, сколько бы вы не использовали одну и туже конструкцию (разумеется с одинаковыми параметрами) она будет вычислена только один раз. В примере выше в переменной REL будет вычислена релевантность.
Эта величина зависит прежде всего от количества слов в полях tilte и body, того насколько близко данное слово встречается к началу текста, отношения количества встретившихся слов к количеству всех слов в поле и др. Например, релевантность будет не нулевая, если слово database встретится либо в title, либо body, но если оно встретится и там и там, значение релевантности будет выше, нежели если оно два раза встретится в body.
Сама по себе релевантность ничего не определяет. Это лишь сравнительная характеристика, по которой можно сортировать результат выборки, не более того.
Еще следует заметить что для IN NATURAL LANGUAGE MODE действует так называемое «5. Это означает, что если слово встречается более чем в 5. MATCH- AGAINST IN BOOLEAN MODE. В бинарном режиме, в отличие от других режимов, релевантность вычисляется несколько иначе — как условная мера совпадения заданного шаблона.
Положение искомого шаблона в тексте, количество встретившихся вариантов роли не играют. Самая важная особенность бинарного режима – возможность указания логических операторов. Сами операторы я приводить не буду, о них хорошо рассказано в оригинальной документации по My. SQL. Еще особенностями бинарного режима является отсутствие автоматической сортировки в случае указания условия WHERE, однако для сортировки можно использовать алиас: SELECT *, MATCH (title,body) AGAINST ('+database My.
SQL' IN BOOLEAN MODE) as RELFROM `articles` WHERE MATCH (title,body) AGAINST ('+database My. SQL' IN BOOLEAN MODE)ORDER BY REL; Пример выведет все записи содержащие слово database, но если в записи присутствует слово My. SQL, то его релевантность будет выше. Записи будут отсортированы по релевантности. В бинарном режиме отсутствует ограничение «5. Бинарный режим можно использовать и без создания полнотекстового индекса, однако это будет работать очень медленно.
MATCH- AGAINST IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION. Или просто «WITH QUERY EXPANSION». Работает примерно также, как NATURAL LANGUAGE MODE, с той лишь разницей, то в результат поиска попадают не только совпадения с шаблоном, но и возможные логические совпадения. Это работает примерно так: Сначала My. SQL выполняет запрос аналогичный NATURAL LANGUAGE MODE и формирует результат. По этому результату производится попытка вычислить слова, которые так же имеют высокую релевантность для полученной выборки. В случае, если эти слова присутствуют производится поиск и по ним тоже, но значение их на релевантность будет существенно ниже.
Отдается смешанная выборка – сначала те результаты, где слово присутствует, а потом те, которые были получены в результате «повторного» поиска. WITH QUERY EXPANSION не рекомендуется использовать для больших объемов информации, так как в результат может попасть очень много лишнего. Пара слов об алгоритмах поиска. Ну, конечно полнотекстовый поиск можно использовать прежде всего для написания алгоритмов поиска. Я не буду заострять на них внимание, скажу просто что при индексации текстовой информации может понадобиться сложный алгоритм обработки, например такой: убрать все HTML- тегиубрать все непечатные символы, знаки препинания и тому подобноеубрать все слова длинной менее 3- х символовперевести все слова в нижний регистр. Соответственно, с поисковым запросом надо сделать тоже самое.
Режим поиска используется любой – как удобнее… А вообще поиск – это отдельная тема, про которую нужна отдельная статья. Раскрытие связок многое- ко- многим. В некоторых случаях – не во всех – с помощью полнотекстового поиска можно раскрывать соотношения многое- ко- многим без привлечения третьей таблицы. Допустим, у нас есть две большие таблицы: с пользователями и группами пользователей. Причем, каждый пользователь имеет отношение к большому количеству различных групп, в свою очередь группы включают в себя большое количество пользователей. При нормальном соотношении (т. Однако можно выполнить денормализацию по следующей схеме: Теперь, что бы выбрать группы, принадлежащие к пользователю 2 можно сделать: SELECT *FROM `groups` WHERE MATCH (groups) AGAINST ('+user.
IN BOOLEAN MODE); Это будет работать намного быстрее, чем исходный вариант (с 3- ей таблицей). Аналогично с группами, но если подобные выборки нам в принципе не нужны, то можно обойтись без соответствующего поля в таблице групп. Тогда получится что- то вроде «односторонней» связи M: N. То есть можно вычислить все M, которые принадлежат к N, не нельзя сделать обратного. В этом случае, как правило, используется IN BOOLEAN MODE. Кстати, на эту схему очень хорошо ложится тегирование информации, но там не все так просто и это опять же отдельная тема.
Использование релевантности как меры отношения одного объекта к другому. Один из алгоритмов для вычисления статей, «похожих» на данную статью. Всё просто: берутся теги данной статьи, и делается полнотекстовый запрос по полю с тегами всех остальных статей с сортировкой по релевантности (если она нужна). Естественно, сначала вылезут те, которые содержат максимальное совпадение по тегам. Можно и без учета тегов.
Если статьи индексированы для полнотекстового поиска, из индекса выбираются с десяток наиболее употребляемых слов, после чего делается поиск по ним. Или вот еще пример – интересы пользователей. Используя точно такую же схему можно легко найти других пользователей, у которых интересы наиболее соответствуют вашим. И кое- что в заключение.
Несмотря на все возможности полнотекстовых индексов, стоит учитывать, что сами индексы занимают очень значительное место на диске, и изменения таблиц с ними будет выполняться значительно дольше.