Поиск на php


ez code

Просто о сложном.

Делаем простой поиск на PHP, jQuery, MySql

Сегодня мы сделаем поиск, который поможет посетителям вашего сайта найти нужную информацию.

Лучший способ удержать своих посетителей на сайте — это дать им возможность найти то, что они хотят. Если вы сделаете эту возможность простой и красивой, они обязательно вернутся на сайт и найдут нужную информацию.

Этот урок расскажет нам, как создать простую, но эффективную поисковую форму, которая будет показывать результаты без перезагрузки страницы.

Мы создадим 2 файла: search.php — он будет содержать HTML форму и javascript, и do_search.php — в этом файле будет алгоритм поиска.

Это обычная html форма, которая будет отправлять запрос файлу do_search.php методом POST. Код файла do_search.php:

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

Таким образом мы создали простую поисковую форму для показа результатов без перезагрузки страницы.

Поиск по сайту

Надыбал готовое решение формы поиска по сайту с использованием БД.

Имеется файл search.php и в нем след. код (установлен в самом начале страницы до :

и далее в теге body установлена форма для поиска:

и после нее стоит еще один код для вывода результатов:

05.10.2013, 03:29

Поиск по сайту: не могу разобраться, как делать поиск по нескольким полям
поиск по одному полу осуществляется вот так: SELECT * from tablepart WHERE `marka` LIKE ‘%» .

Поиск по сайту
Здравствуйте! Проблема в том, что при введение любого слова в поиск, мне выводит каждый раз (хотя.

Поиск по сайту
Здрасте всем! Сделал сайт, сделал на нем форму поиска. А как сделать так, чтобы эта форма.

Поиск по сайту
Здравствуйте! Помогите пожалуйста сделать поиск по сайту. Таблица news. Три столбика: id.

Поиск по сайту
21 05.10.2013, 04:03 2 05.10.2013, 08:13 [ТС] 3

нет, как раз таки код универсальный. единственное что в полях:

я вставил свои значения базы данных, т.е.:

05.10.2013, 08:17 4

И база данных у вас точ в точ?

Добавлено через 1 минуту
Советую, смотреть что прилетает в каждую переменную, сверху вниз. (следом за интерпретатором)


05.10.2013, 08:17
05.10.2013, 11:27 [ТС] 5

да все параметры БД теже.

Добавлено через 26 секунд

05.10.2013, 11:29 6
05.10.2013, 12:52 [ТС] 7

есть некие поля page_id, title, desc, title_link, category, uniq_id кот. проверяются.

только как и где их прописать, я не пойму.

p.s.: в программировании я полный ноль (на php особенно)

05.10.2013, 12:59 8

Ну и как же мы с вами будем код отлаживать и искать ошибку.

Добавлено через 57 секунд

есть переменная, сюда попадает результат от запроса к базе данных. Нужно проверить, что туда попало.

Добавлено через 44 секунды
А вообще, нужно хоть почитать основы PHP иначе ничего толком вы не сделаете!

Добавлено через 1 минуту

06.10.2013, 00:08 [ТС] 9

база создана! но в ней я таблицу не строил. т.к. видимо сам скрипт ее построит.

Добавлено через 49 секунд

06.10.2013, 00:51 10
06.10.2013, 04:07 11

Антон Терентьев, давайте так, вы прочтете книжку по PHP, MySQL, хотя бы азы, а потом мы с вами продолжим тему.

Дело в том, что даже если мы с вами и найдём ошибку, то потом будут опять вопросы. Вы согласны?!

Скажу ещё на вскидку, что скорее всего ошибка не в коде, а в том что вы не создали таблицу в БД, поэтому PHP ничего вам не находит.

06.10.2013, 16:49 [ТС] 12

Вы абсолютно правы, я ничего не создавал в БД.

Поможете составить таблицу?

06.10.2013, 17:00 13
11.10.2013, 19:01 [ТС] 14

для составления таблицы полагаю требуется три поля (как минимум) для поиска в базе. эти самые поля обозвать, как допустим:
page_id — идентификатор страницы с новостью (допустим адрес этой странички, например, news1.html)
title — текст в заголовке новости
desc — текст самой новости
title_link — ссылка на страницу с новостью
а поля category и uniq_id думаю можно вообще удалить.

теперь!
вот есть страница с новостью (пример):

— page_id
— «Открытие сайта» — заголовок (title)
— «Сегодня мы открылись! Поздравьте нас!» — текст новости (desc)
— news1.html — title_link (ссылка на страницу с новостью)

вот теперь как поэтапно по этим данным создать БД именно для этого примера?

Поиск по файлам на PHP [закрыт]

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

Как объединить эти 2 фрагменты кода в 1, чтобы найденные файлы подключались к основному файлу? То есть нужно передать найденное имя файла в функцию подключения файлов.

Закрыт по причине того, что непонятна суть вопроса участниками sanmai, aleksandr barakin, 0xdb, Andrew Goroshko, entithat 20 июл в 10:59 .

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

Простой поиск файлов по названию и расширению на PHP

Привет, друзья! Довелось мне поработать на одном коммерческом сайте. И, как выяснилось, с течением недолгого времени на сайте пропала часть изображений. Удалять их, конечно же, никто не удалял, и предположения были, что папку случайно перенесли в другое место.

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

Два варианта поиска файлов по названию на PHP

В этом блоке я представляю вашему вниманию два разных варианта поиска файлов на вашем хостинге по названию.

1. Точный поиск по названию:

2. Неточный поиск (по наличию слова в названии):

Во всех вариантах – переменная $name_search содержит в себе слово (слова) для вашего поиска по файлам.

Код вы вставляете в файл PHP с любым именем, после чего грузите его на ваш хостинг.

Обращаетесь к нему на вашем сайте, и на выходе (при положительном результате) вы получите список найденных файлов с полным их местоположением.

Поиск файлов по расширению на PHP

В поисках файлов по расширению, как вы поняли, не учитывается имя, а учитывается его формат. Например, у изображений это может быть PNG, JPG или GIF, а у аудиофайлов – MP3, WAVE и другие.

Его вы также вставляете в PHP-файл, грузите на хостинг и обращаетесь для получения результатов поиска.

Обратите внимание, что регистр во всех вариантах имеет значение. И, например, если файл на хостинге имеет расширение MP3, а в переменной для поиска вы указали «mp3» – файлы найдены не будут. Но этот момент можно подправить с помощью функции «mb_strtolower».

Поиск на сайте своими руками

Наверное, многие когда-нибудь задумывались, как сделать поиск на сайте? Безусловно, для крупных сайтов с большим количеством контента поиск является просто незаменимой вещью. В большинстве случаев пользователь, впервые посетив Ваш сайт в поисках чего-либо важного, не станет разбираться в навигационных панелях, выпадающих меню и прочих элементах навигации, а в спешке попытается найти что-нибудь похожее на поисковую строку. И если такой роскоши на сайте не окажется, либо он не справится с поисковым запросом, то посетитель просто закроет вкладку. Но статья не о значении поиска для сайта и не о психологии посетителей. Я расскажу, как реализовать небольшой алгоритм полнотекстового поиска, который, надеюсь, избавит начинающих разработчиков от головной боли.

У читателя может возникнуть вопрос: зачем писать все с нуля, если все уже давно написано? Да, у крупных поисковиков есть API, есть такие клевые проекты, как Sphinx и Apache Solr. Но у каждого из этих решений есть свои преимущества и недостатки. Пользуясь услугами поисковиков, типа Google и Яндекс, Вы получите множество плюшек, таких как мощный морфологический анализ, исправление опечаток и ошибок в запросе, распознавание неверной раскладки клавиатуры, однако без ложки дегтя тут не обойдется. Во первых, такой поиск не интегрируется в структуру сайта — он внешний, и Вы не сможете указать ему, какие данные наиболее важны, а какие не очень. Во вторых, содержимое сайта индексируется только с определенным интервалом, который зависит от выбранного поисковика, так что если на сайте что-нибудь обновится, придется дожидаться момента, когда эти изменения попадут в индекс и станут доступными в поиске. У Sphinx и Apache Solr дела с интеграцией и индексированием гораздо лучше, но не каждый хостинг позволит из запустить.

Ничто не мешает написать поисковый механизм самостоятельно. Предполагается, что сайт работает на PHP в связке с каким-нибудь сервером баз данных, например MySQL. Давайте сначала определимся, что требуется от поиска на сайте?

  • Поиск с учетом языковой морфологии. Не зависимо от падежа, окончания и
    других прелестей великого и могучего языка поиск должен находить то, что нужно
    пользователю. Другими словами, «яблок», «яблока», «яблоки» — это формы одного и того
    же слова «яблоко», что нужно учитывать в поисковом алгоритме. Одним из способов
    достижения данной цели является приведение каждого слова поискового запроса и слов
    содержимого сайта к базовой форме.
  • Возможность указать контекст поиска. То есть, возможность самостоятельно выбрать
    контент сайта, в пределах которого будет работать поисковый алгоритм, а также определить
    значимость для каждого из пределов. Например, рассмотрим интернет-магазин. Предполагается,
    что поисковый запрос чаще всего будет содержать название искомой продукции, поэтому поиск по
    названиям товара будет иметь наивысший приоритет. В качестве следующего приоритета можно
    выбрать поиск по свойствам товаров, затем поиск по описанию.
  • Индексирование содержимого сайта. Представьте ситуацию: одновременно около 30 человек
    выполняют поисковые запросы. Сервер принимает каждое соединение, управление потоком
    передается интерпретатору PHP. При каждом запросе заново инициализируется поисковый
    движок, заново перерывается содержимое сайта… Сложно сказать, сколько времени и
    ресурсов потребуется, чтобы обработать все эти запросы. Именно для того, чтобы не
    делать одну и ту же работу по сто раз, была придумана технология индексирования.
    Индексирование выполняется только при изменении или добавлении содержимого сайта,
    а поиск выполняется уже по индексу, а не по содержимому.
  • Механизм ранжирования. Ранжирование результатов поиска — это сортировка результатов поиска, выполняемая на основе оценки значимости найденных данных. Например, в каком-нибудь блоге выполняется поисковый запрос «космос». Данное слово содержится в двух статьях: в первой 16 раз, во второй — 5 раз. Вероятнее всего, первая статья будет иметь большее значение для инициатора поиска. Также каждой разновидности содержимого сайта при индексировании задается определенный коэффициент, который будет влиять на его позиции в поисковой выдаче.


Теперь пару слов о том, что нам предстоит реализовать:

  • морфологический анализатор,
  • алгоритм ранжирования,
  • алгоритм индексирования,
  • алгоритм поиска.

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

Принцип работы

Со стороны бэкенда поиск работает так:

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

Подготовка

Задача поставлена, теперь можно перейти к делу. Я использую Linux в качестве рабочей ОС, однако постараюсь не использовать ее экзотических возможностей, чтобы любители Windows смогли «собрать» поисковый движок по аналогии. Все, что Вам нужно — это знание основ PHP и умение обращаться с MySQL. Поехали!

Наш проект будет состоять из ядра, где будут собраны все жизненно необходимые функции, а также модуля морфологического анализа и обработки текста. Для начала создадим корневую папку проекта firewind, а в ней создадим файл core.php — он и будет ядром.

Теперь вооружаемся своим любимым текстовым редактором и подготавливаем каркас:

Тут мы создали основной класс, который можно будет использовать на Ваших сайтах. На этом подготовительная часть заканчивается, пора двигаться дальше.

Морфологический анализатор

Русский язык — довольно сложная штука, которая радует своим разнообразием и шокирует иностранцев конструкциями, типа «да нет, наверное». Научить машину понимать его, да и любой другой язык, — довольно непростая задача. Наиболее успешны в этом плане поисковые компании, типа Google и Яндекс, которые постоянно улучшают свои алгоритмы и держат их в секрете. Придется нам сделать что-то свое, попроще. К счастью, колесо изобретать не придется — все уже сделано за нас. Встречайте, phpMorphy — морфологический анализатор, поддерживающий русский, английский и немецкий языки. Более подробную информацию можно получить тут, однако нас интересуют только две его возможности: лемматизация, то есть получение базовой формы слова, и получение грамматической информации о слове (род, число, падеж, часть речи и т.д.).

Нужна библиотека и словарь для нее. Все это добро можно найти тут. Библиотека находится в одноименной папке «phpmorphy», словари расположены в «phpmorphy-dictionaries». Скачиваем последние версии в корневую папку проекта и распаковываем:

Отлично! Библиотека готова к использованию. Пришло время написать «оболочку», которая абстрагирует работу с phpMorphy. Для этого создадим еще один файл morphyus.php в корневой директории:

Пока реализовано только два метода. get_words разбивает текст на массив слов, фильтруя при этом HTML-теги и сущности типа » «. Метод lemmatize возвращает массив лемм слова, либо false, если таковых не нашлось.

Механизм ранжирования на уровне морфологии

Давайте остановимся на такой единице языка, как предложение. Наиболее важной частью предложения является основа в виде подлежащего и/или сказуемого. Чаще всего подлежащее выражается существительным, а сказуемое глаголом. Второстепенные члены в основном употребляются для уточнения смысла основы. В разных предложениях одни и те же части речи порой имеют совершенно разное значение, и наиболее точно оценить это значение в контексте текста сегодня может только человек. Однако программно оценить значение какого-либо слова все-таки можно, хоть и не так точно. При этом алгоритм ранжирования должен опираться на так называемый профиль текста, который определяется его автором. Профиль представляет из себя ассоциативный массив, ключами которого являются части речи, а значениями соответственно ранг (или вес) каждой из них. Пример профиля я покажу в заключении, а пока попробуем перевести эти размышления на язык PHP, добавив еще один метод к классу morphyus:

Индексирование содержимого сайта

Как уже говорилось выше, индексирование заметно ускоряет выполнение поискового запроса, так как поисковому движку не нужно обрабатывать контент каждый раз заново — поиск выполняется по индексу. Но что же все-таки происходит при индексировании? Если по порядку, то:

  • Сначала из текста формируется массив слов, и делается это с помощью метода get_words.
  • Согласно профилю, из текста отбрасываются незначимые части речи.
  • Значимые оцениваются по пятибальной шкале, с помощью метода weigh.
  • Для каждого сова выполняется поиск лемм, иначе говоря базовых форм.
  • Рассчитывается количество повторений каждого слова и суммарный ранг.
  • Все данные записываются в объект и в виде JSON записываются в базу данных.

В результате получается объект следующего формата:

Пишем инициализатор и первый метод ядра поискового движка:

Теперь при добавлении или изменении данных в таблицах достаточно просто вызвать данную функцию, чтобы проиндексировать их, но это не обязательно: индексирование может быть и отложенным. Первым аргументом метода make_index является исходный текст, вторым — коэффициент значимости индексируемых данных. Ранг каждого слова, кстати, расчитывается по формуле:

Хранение индексированных данных

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


Нерешенным остался лишь вопрос формата индексированного содержимого, ведь make_index возвращает объект, и так просто в базу данных или файл его не запишешь. Можно использовать JSON и хранить его в полях типа LONGTEXT, можно BSON или CBOR, используя тип данных LONGBLOB. Два последних формата позволяют представлять данные в более компактном виде, чем первый.

Как говорится, «хозяин — барин», так-что решать, где и как все будет храниться, Вам.

Benchmark

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

На моей машине с конфигурацией:
CPU: Intel Core i7-4510U @ 2.00GHz, 4M Cache
RAM: 2×4096 Mb
OS: Ubuntu 14.04.1 LTS, x64
PHP: 5.5.9-1ubuntu4.5

Индексирование заняло около секунды:

Думаю, вполне неплохой результат.

Реализация поиска

Остался последний и самый главный метод, метод поиска. В качестве первого аргумента метод принимает индекс поискового запроса, в качестве второго — индекс содержимого, в котором выполняется поиск. В результате выполнения возвращается суммарный ранг, рассчитанный на основе ранга найденных слов, либо 0, если ничего не нашлось. Это позволит сортировать поисковую выдачу.

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

Реализация поиска на примере интернет-магазина

Допустим, информация о продаваемой продукции хранится в таблице production:

А описание в таблице description:

Поле production.keywords будет содержать индекс ключевых слов продукта, description.index будет содержать индексированное описание. И все это будут храниться в формате JSON.

Вот пример функции добавления нового продукта:

Здесь поисковый механизм был интегрирован в функцию добавления нового продукта магазина. А теперь обработчик поисковых запросов:

Данный сценарий принимает поисковый запрос в виде GET-параметра query и выполняет поиск. В результате выводятся найденные продукты магазина.

Заключение

В статье был описан один из вариантов реализации поиска для сайта. Это самая первая его версия, поэтому буду только рад узнать Ваши замечания, мнения и пожелания. Присоединяйтесь к моему проекту на Github: https://github.com/axilirator/firewind. В планах добавить туда еще кучу всяких возможностей, вроде кэширования поисковых запросов, подсказок при вводе поискового запроса и алгоритма побуквенного сравнения, который поможет бороться с опечатками.

Всем спасибо за внимание, ну и с днем информационной безопасности!

Поиск в MySQL РНР

Это первое руководство из серии Практическое Программирование на PHP. Итак, позвольте мне начать, сегодня я собираюсь рассказать вам, как создать поисковый механизм, который вы смогли бы использовать на своем сайте или на каком-либо другом проекте. Для написания этого руководства я использовал базу данных MySQL,
код, совместимый с PHP 3 и 4.

Задний план

Прежде, чем мы начнем, я покажу вам таблицу, которая будет использована в примерах:

First_Name

Middle_Name Last_Name
Dana Jhonson Smith
Jill Angel Pete
Jack Coner Mitchel

Погружаемся в Работу

Прежде, чем мы действительно займемся созданием поискового механизма, нам надо
будет создать основную веб-страницу, на которой будет находиться поле для ввода запроса на поиск. Я сделал самую простую форму, если вам станет легче — сделайте более сложную с массой излишеств. Код моей страницы ниже:

Simple Search Engine version 1.0

Enter the first, last, or middle name of the person you are looking for:


Поиск на php

Как сделать алгоритм поиска по нескольким словам на PHP из БД

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

Имеется таблица «news», которая содержит следующие поля: id, title и content:

Требуется осуществить поиск по полю content в нашей базе данных, которая состоит из следующих столбцов, пример смотрите на картинке выше. Приступим к реализации. Для начала создадим страницу для тестирования работы. Она будет содержать форму с полем ввода ключевых слов и кнопку «найти»:

Листинг html кода:

В атрибутах формы прописываем путь к обработчику, содержащему алгоритм, и метод передачи post.

Для передачи массива отобранных элементов мы используем сессию.

Для этого мы запускаем ее в самом начале страницы.

Для вывода будем использовать функцию print_r().

Для того чтобы после перезагрузки страницы результат не отобразился второй раз, с помощью unset мы убиваем сессию.

Создадим обработчик search.php. Для начала запускаем сессию и подключаемся к базе данных:

Подробнее о подключении к базе данных через PDO смотрите в этой статье .

Работа алгоритма представлена на схеме:

Разберем выборку по первому слову, в качестве примера будем использовать поисковый запрос «как сделать сайт»:

Сначала в переменую $str получаем строку из формы методом POST. Разбиваем эту строку на слова через пробел с помощью функции expode и подсчитываем количество слов. Осуществляем запрос, в котором проверяем наличие первого слова в столбце content. Создаем пустой массив и записываем в него значения, полученные в результате выборки по запросу. Записываем в $id_count количество полученных элементов.

Далее рассматриваем остальную часть схемы, на которой отображается по второму и последующим ключевым словам:

Эта часть алгоритма работает по принципу «отсеивания». Допустим в базе данных имеется десять статей. После выборки по первому слову мы получаем id статей в которых есть слово «как», таких статей оказалось шесть. Далее мы производим поиск второго слова среди этих шести статей, тем самым сузив круг поиска. В результате этой итерации остается четыре статьи, которые включают в себя оба слова «как» и «сделать». На последней итерации среди оставшихся четырех статей мы ищем слово «сайт». После этого прохода получаем id одной единственной статьи, которая включает в себя все ключевые слова.

Количество итераций равно количеству слов в поисковом запросе. Конечное количество полученных id может быть любым, в зависимости от запроса и содержимого таблицы базы данных.

Если в результате выполнения запроса в цикле мы получаем id (переменная temp), равное одному из id предыдущей выборки (id_mass[]), то этот id мы оставляем неизменным. В противном случаем мы присваиваем элементу id_mass[ j ] значение -1, тем самым исключив его из обработки.

После окончания работы циклов мы получаем массив из id, в которых найдены ключевые слова и -1. Чтобы передать пользователю только требуемые id, мы используем цикл, в котором идет проверка, в результате которой отбрасываются все элементы равные -1. Остальные же элементы мы передаем в массив сессии:

Функция header служит для перенаправления клиента на страницу поиска.

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

Смотрите также дополнительные статьи про MVC

Морфологический поиск на русском языке на PHP и MySQL

Важной функцией на сайте является поиск по разделу или по всему сайту. Это позволяет пользователю быстро найти необходимую информацию. Чаще всего этот вопрос решается с помощью полнотекстового поиска или поиска по базе через выражение LIKE. Полнотекстовый поиск удобен тем, что перекладывает вопрос ранжирования страниц по релевантности на СУБД, позволяет искать фразы.

Но вместе с тем накладывает некоторые ограничения, в частности, заставляет использовать таблицы типа MyISAM, не осуществляет поиск слов, короче 4-ех символов, создает дополнительные индексы. Поиск через выражение LIKE менее удобен для разработчика, так как работает медленнее, осложняет поиск фраз. Общим недостатком обоих подходов является невозможность морфологического поиска. Например, в каталоге товаров присутствет товар «Букет из желтых роз», при поиске по фразе «красные розы» пользователь не увидит этот товар в результатах. А хотелось бы, чтобы машина хоть немного понимала естественный язык. Решить эту проблему несложно на PHP и в этом нам поможет phpMorphy. phpMorphy позволяет решать следующие задачи:


  • Лемматизация (получение нормальной формы слова)
  • Получение всех форм слова
  • Получение грамматической информации для слова (часть речи, падеж, спряжение и т.д.)
  • Изменение формы слова в соответствии с заданными грамматическими характеристиками
  • Изменение формы слова по заданному образцу

Поддерживаемые языки: Русский, Английский, Немецкий (AOT). Украинский, Эстонский (на основе ispell). Есть возможность добавить поддержку других языков при помощи myspell словаря. Словари можно взять здесь (http://sourceforge.net/projects/phpmorphy/files/phpmorphy-dictionaries/). Выбирайте в зависимости от версии библиотеки и кодировки.

Поддерживаются различные кодировки:

  • все однобайтовые (windows-1251, iso-8859-* и т.п.)
  • Unicode кодировки — utf-8, utf-16le/be, utf-32, ucs2, ucs4.

Следует учесть что использование этой библиотеки создаст некоторую дополнительную нагрузку на сервер при инициализации и работе.

Для начала скачайте архив библиотеки и распакуйте его, например, в папку «phpmorphy» . По возможности в директории недоступной web серверу. Далее, скачайте словари с определенным языком и кодировкой и распакуйте их в папку «phpmorphy/dicts» данной библиотеки. Для инициализации библиотеки подключите файл common.php из папки «phpmorphy/src» и выставите настройки:

С возможными опциями настройки библиотеки можно ознакомиться здесь (http://phpmorphy.sourceforge.net/dokuwiki/manual).

Для поиска мы будем использовать следующий подход: слова в поисковой фразе будем приводить к их начальной форме, индексировать контент для поиска также, приводя отдельные слова к начальной форме, и в зависимости от частоты повторения и местонахождения слова — задавать ему вес, далее — искать по таблице индексов поисковую фразу и ранжировать результаты по весу.

Для начала проиндексируем контент, по которому будет происходить поиск. В нашем примере поиск происходит по цветам в каталоге товаров. У товара есть идентификатор, наименование, краткое и полное описание. Кодировка — UTF-8, collate — utf8_bin . Создадим таблицу с товарами:

и таблицу, в которой будут храниться индексы:

здесь `word` — ключевое слово, `prod_id` — идентификатор товара, `weight` — вес слова. Каждая запись характеризуется уникальной парой слово-товар.

Далее возьмем из базы все записи о товарах:

При работе с библиотекой PhpMorphy cледует помнить, что термины в словарях хранятся в верхнем регистре, для удобства переведем контент в верхний регистр. Также возможно появление слов с буквой «ё» , collate utf8_bin гарантирует нам отсутствие ошибок, связанных с уникальностью ключей в таблице `prod2search` , так как буквы «е» и «ё» не будут считаться одним символом, однако будет неправильным если слова «ЗЕЛЕНЫЙ» и «ЗЕЛЁНЫЙ» будут индексироваться отдельно. Поэтому мы заменяем букву «ё» на «е» . В подробном описании могут содержаться html-теги, их мы не будем индексировать и от них следует избавиться.

Здесь приведем скрипт, индексирующий товары, а далее дадим пояснения.

Данное регулярное выражение разбивает контент на отдельные слова. Для кириллицы используется модификатор «u» . Следует помнить, что буква «ё» не попадает в диапазон «а-я» . Регулярное выражение корректно обработает такую строку:

Массив $word_pma[1] содержит список отдельных слов.

под $morphy мы подразумеваем экземпляр класса phpMorphy , $morphy->lemmatize() приводит слово в строке или массив слов к начальной форме и возвращает массив вида «Исходное слово» => Массив со списком слов в начальной форме . Метод lemmatize() по умолчанию сравнивает слово по словарям, при отрицательном результате пытается образовать начальную форму по внутренним правилам, если и это не удается вместо массива возвращается FALSE . В нашем примере мы использовали только русский словарь, но выбирали также и английские слова. Поэтому при невозможности образовать начальную форму мы индексировали входящее слово:

повторяется в коде несколько раз потому что, нам необходимо выставить разный вес словам в зависимости от их местонахождения. Словам в заголовке мы задаем вес 3, словам в кратком описании — 2, в полном — 1. При повторе слова увеличиваем его вес.

В итоге у нас получается массив $word для одного товара, который имеет вид «Слово» => «Вес» . Эти данные заносим в таблицу `prod2search` :

Скрипт еще возможно улучшить, например, запретить индексирование определенных предлогов; индексировать определенные части речи, например, только существительные и прилагательные; исключать поиск по словам, которые присутствуют более чем в половине записей, к примеру слово «описание» входит в полное описание каждого товара и поиск по этому слову и никак не характеризует конкретный товар.

Данный скрипт позволяет с нуля проиндексировать весь контент, и служит лишь дополнительной утилитой. В реальном приложении необходимо индексировать текстовый контент только при добавлении или редактировании конкретной записи. Для индексации контента воспользуемся приведенным выше скриптом, но только не будем использовать цикл и будем работать с одной записью. При редактировании, до внесения индексов в таблицу `prod2search` или при удалении товара — удалять неактуальные записи:

где $prod_id — идентификатор редактируемого или удаляемого товара.

Можно произвести некоторую оптимизацию. Допустим, кроме наименования, краткого и полного описания товар обладает еще несколькими характеристиками, и при редактировании пользователь меняет только цену. В этом случае индексированный контент не изменился и не требуется его повторная индексация. Этого можно избежать сравнив хеши индексируемого контента до и после редактирования товара. Сольем индексируемые поля в одну строку и получим ее хеш через md5($str) , далее вставим полученное значение в форму и передав данные на сервер сравним хеш до и после редактирования. Если хеши совпадут, значит контент не менялся и не требуется его переиндексация.

После того как проиндексирован весь контент и таблица `prod2search` заполнена данными можно приступать к реализации поиска.

Разберем запрос. Мы находим записи в таблице `prod2search` , в которых слова из списка слов в поисковой фразе WHERE `s`.`word` IN (» . implode ( «,», $sql ) . «) . При поиске по нескольким словам, несколько слов относятся к одному и тому же товару, чтобы товары в результате не дублировались мы группируем результат по товару GROUP BY `s`.`prod_id` . В этом же случае мы суммируем вес найденных слов для одного товара SUM(`weight`) AS `weight_sum` . Например, мы ищем «красные розы» — у товара, у которого оба слова встречаются в описании, вес будет больше, чем у товара с одним словом. Результаты выборки мы ранжируем по релевантности, то есть весу ORDER BY `weight_sum` DESC . Для того чтобы при поиске нескольких слов в результате мы получили только те товары, в описании которых встречаются ВСЕ попавшие в запрос слова, мы учитываем сколько слов для одного товара найдено COUNT(`s`.`prod_id`) AS `num` и ставим условие HAVING `num` = «.count ( $sql ).» . В данном случае реализуется логическое «И», соединяющие слова в поисковой фразе, для логического «ИЛИ» условие следует упустить. В итоге мы получаем список идентификаторов товаров, которые подходят под критерий поиска. Для наглядности записи с товарами мы берем вложенным запросом, однако на практике, возможно, лучшим решением будет взять список товаров отдельным запросом по их идентификаторам. Вариант запроса с логическим «ИЛИ» и лимитами будет работать значительно быстрее.

Таким образом, на примере каталога цветов мы реализовали морфологический поиск на русском языке с использованием PHP, MySQL и PhpMorphy. Данный метод можно применить к любым разделам вашего сайта и сблизить посетителя и вас, просто выдав пользователю информацию, которую он искал.


Скрипт PHP для поиска на сайте

Здравствуйте, друзья. Хочу с вами поделиться скриптом, который вы можете использовать по своему усмотрению. Я уверен, что вы сможете легко его усовершенствовать под свои нужды. В конце статьи вы найдете ссылку на скачивание этого скрипта. В исходниках скрипта вы найдёте необходимые файлы для его встраивания на свой сайт. Также в конце статьи вас ждет ссылка на один неплохой материал, который, я надеюсь, поможет вам усовершенствоваться как разработчику. А теперь к делу!
Для начала создадим таблицу, в которой будут хранится найденные статьи:

Для работы с таблицой «searchers» будем использовать класс «Search» из файла «Search.class.php»:

Как видите мы подключаем еще один класс «DB» из файла «DB.class.php» для работы с базой:

Измените свойства класса «DB», добавив информацию о Вашей базе.

Теперь напишем основные строки кода из файла «view_search.php»:

Теперь по порядку покажем описание функций, используемых здесь. Описание функции «GetSearchArrayX»:

Описание функции «DeleteEndings»:

Описание функции «SearchWords»:

Описание функции «check_id»:

Описание функции «ViewArticles»:

Описание функции «SearchArticles»:

Описание функции «GetSearchArray»:

Описание функции «MarkAll»:

Пожалуйста, Войдите или Зарегистрируйтесь чтобы получить ссылку на скачивание.

Живой поиск по БД с помощью jQuery и PHP

Рассмотрим рабочий вариант скрипта, который позволит ajax методом получать результаты поиска из БД при вводе пользователем поисковых запросов. Реализовывать это все мы будем за счет одного виджета autocomplete библиотеки jquery-ui.js

О том как делать автозаполнение полей я писал ранее и даже говорил о принципе поиска через PHP. Поэтому сегодня хочу более подробно рассмотреть процесс выгрузки результатов поиска не только в низпадайке (как если бы это был выпадайющий список), но и процесс создания таблицы результатов поиска с любыми данными из БД (ссылки, картинки, id номера, любые поля).

Создайте index.html , подключите в нем скрипты (как в моем примере) и пропишите код:

Из предыдущей публикации вы уже должны разбираться, что делает каждая строка. Обратим внимание на ключевые моменты.

  • source — источник поиска, в данном случае файл, который лежит в той же директории, что и index.html
  • minLength — минимальное число символов, чтобы поиск начал искать
  • appendTo: ‘.uirezultbd’ — в какой html вставить результаты поиска (если убрать, будет низпадайкой, как в обычном случае)
  • open: function(event, ui) — действие в момент поиска (когда набирается текст) — добавляем шапку результатов поиска

Т.е. скрипт работает так: когда мы вводим что-то в поле name=»s_search5″ , то идет обращение с этим запросом (как $_GET[‘term’] ) к файлу poiskbest.php . В нем делаем подключение к БД и ищем столбец методом LIKE на совпадение. Если что-то найдется, то возвратится JSON ответ, который подхватит наш скрипт в index.html. А результат поиска отобразится в классе uirezultbd .

Теперь рассмотрим poiskbest.php

//подключаемся к БД
$thisbd = @mysqli_connect(‘localhost’, ‘root’, », ‘swork’) or die(«Ошибка соединения с базой данных: «.mysql_error());
mysqli_query($thisbd, «SET NAMES utf8»);

$count = 0;
if($_GET[‘search_tip’] == ‘title’) < //Тип поиска - таких может быть бесконечно много - передается с autocomplete
$fetch = mysqli_query($thisbd, «SELECT * FROM wl8ac_content WHERE title LIKE ‘».mysqli_real_escape_string($thisbd, $_GET[‘term’]).»%’ ORDER BY title LIMIT 20″); //$_GET[‘term’] — поисковый запрос от autocomplete
while ($podrow = mysqli_fetch_array($fetch)) <
//формируем ассоциативный массив результата поиска
$return_arr[] = array(
‘label’ => ‘

Я думаю, из комментариев, которые есть в коде все ясно. Если кратко повторить, то сначала подключаемся к БД и ищем в таблице wl8ac_content (кстати, это материалы Joomla) записи по полю title. Также ограничиваем результаты поиска до 20 ( LIMIT 20 ). Далее формируем ассоциативный массив (в нем должны быть обязательно 2 параметра label и value ) из нужных полей, которые отобразятся в результатах. Для примера я взял 3 поля id, title, created , а 4-й «столбец» сделал ссылкой на материал. После того, как массив будет создан, возвратим данные методом json_encode() .

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

Илон Маск рекомендует:  Что такое код get_class_vars
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL