<MyRusakov.ru />

Фреймворк Yii 2.0 с нуля. Пример создания сайта

Фреймворк Yii 2.0 с нуля. Пример создания сайта

Видеокурс "Фреймворк Yii 2.0 с нуля. Пример создания сайта" обучит Вас созданию профессиональных сайтов с использованием фреймворка Yii. В курсе есть 2 раздела: теоретический и практический. В теоретическом разделе будут разобраны возможности фреймворка Yii с примерами их использования, а в практической части будет создан сайт Blog.MyRusakov.ru с помощью полученных знаний из теоретического раздела.

Так же почти ко всем урокам идут упражнения для закрепления материала из урока на практике.

После прохождения курса Вы без труда сможете создавать любые сайты с использованием фреймворка Yii, причём делать это будете быстро и качественно.

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Поиск по базе данных с сортировкой по релевантности

Поиск по базе данных с сортировкой по релевантности

Недавно мне нужно было для одного из заказчиков сделать поиск, причём не просто вывод всех совпадений, а ещё и с сортировкой по релевантности. Многие программисты (да и я тоже раньше так делал) выведут все совпадения, а потом уже в PHP начинают сортировать по релевантности. Однако, в SQL есть уже отличная возможность поиска по базе данных с сортировкой по релевантности.

Единственное условие - это сделать поля, по которым будет идти поиск, ключами FULLTEXT. А теперь сам запрос:

SELECT *, MATCH `field` AGAINST ('$search') as relev FROM `table` ORDER BY relev DESC

В данном запросе ищутся соответствия в поле "field" ключевому запросу $search (там может быть много слов). А некое количество соответствий попадает в переменную relev (по сути, релевантность), по которой потом происходит сортировка по убыванию. И это будет происходить для каждой записи в таблице.

Всё вроде бы хорошо, однако, если Вы выполните данный запрос, то с удивлением обнаружите, что чтобы Вы не подставляли в $search, а в выборке будут абсолютно все записи. Почему? А потому, что мы не написали WHERE, поэтому даже там, где "relev=0" (то есть вообще ничего не найдено), является одним из результатом выборки. И вот изменённый SQL-запрос будет таким:

SELECT *, MATCH `field` AGAINST ('$search') as relev FROM `table` WHERE MATCH `field` AGAINST ('$search')>0 ORDER BY relev DESC

С таким запросом записей без единого совпадения в выборке уже не будет, а все те, где найдено соответствия, будут отсортированы по релевантности.

А что делать, если нам нужно сделать поиск сразу по двумя полям? Тут есть 2 варианта, если Вы создадите 1 общий FULLTEXT для двух полей, то можно написать так:

SELECT *, MATCH `field_1`, `field_2` AGAINST ('$search') as relev FROM `table` WHERE MATCH `field_1`, `field_2` AGAINST ('$search') > 0 ORDER BY relev DESC

А если общий ключ создавать не хотите, то тогда надо выполнить такой запрос (каждое из полей должно быть FULLTEXT):

SELECT *, MATCH `field_1` AGAINST ('$search') + MATCH `field_2` AGAINST ('$search') as relev FROM `table` WHERE MATCH `field_1` AGAINST ('$search') + MATCH `field_2` AGAINST ('$search') > 0 ORDER BY relev DESC

Но вся прелесть данного поиска по базе данных с сортировкой по релевантности состоит в том, что он выполняется очень быстро. Намного быстрее, чем если Вы будете орудовать строковыми функциями PHP в массивах с записями. Поэтому рекомендую использовать данный SQL-запрос при поиске в большинстве случаев, даже когда не требуется вывод по релевантности.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (12):

ilyadenisovid ilyadenisovid 17.05.2013 13:27:20

А FULLTEXT - это что?

Ответить

Admin Admin 17.05.2013 13:55:00

Полнотекстовый индекс.

Ответить

ilyadenisovid ilyadenisovid 17.05.2013 14:45:17

а ГДЕ В phpmyadmin найти его, никак не найду

Ответить

Admin Admin 17.05.2013 21:13:16

http://myrusakov.ru/mysql-index.html - в 4-м пункте на картинке есть иконка в виде буквы "Т", это и есть FULLTEXT.

Ответить

morozov-semen morozov-semen 18.05.2013 10:32:53

Здравствуйте, Михаил. А как можно сделать поиск по релевантности сразу из двух таблиц? К примеру имеется таблица article_1 с полями name и text, а также имеется таблица article_2 тоже с полями name, category и text. Необходимо сделать поиск по всем этим полям. Подскажите пожалуйста, как это можно сделать?

Ответить

Admin Admin 18.05.2013 10:37:25

Нет проблем, указывайте поля и из второй таблицы тоже. http://myrusakov.ru/sql-select-several.html

Ответить

morozov-semen morozov-semen 18.05.2013 10:46:03

Спасибо за информацию

Ответить

morozov-semen morozov-semen 18.05.2013 20:31:02

Михаил, а как при поиске сделать выборку того участка, где встречается искомое слово, как, например, реализовано у вас?

Ответить

Admin Admin 18.05.2013 22:11:11

http://myrusakov.ru/video-search.html

Ответить

fenix1996l fenix1996l 11.08.2013 15:36:29

а как сделать так..чтобы можно было перейти по ссылке на страницу где эта информация находится.как это сделать? и еще вопрос. у меня выводит title и я написал чтобы выводило так же text...но у меня выводит полностью весь текст статьи..как сделать так чтобы выводило 100 символом текста а дальше шло многоточие.?? Заранее спасибо)

Ответить

Admin Admin 12.08.2013 18:48:32

Где она у Вас находится так же и определять из базы. А чтобы строку порезать есть функция substr()

Ответить

cocky cocky 04.10.2014 10:31:30

здравствуйте Михаил! посмотрел ваше видео http://myrusakov.ru/video-search.html и реализовал на своем сайте такой поиск. Но, прочитав эту стаью, предположил, что этот способ лучше или быстрее, решил изменить способ реализации поиска, но ничего не вышло. Стоило ли мне менять способ или нет? эти способы чем-то особенным отличаются?

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.