Как держать форму. Массаж. Здоровье. Уход за волосами

Секреты мужчин search php keywords. Нужно ли заполнять keywords

By Ibrahim Diallo

Published Jul 2 2014 ~ 16 minutes read

Search is an important feature on a website. When my few readers want to look for a particular passage on my blog, they use the search box. It used to be powered by Google Search, but I have since then changed it to my own home-brewed version not because I can do better but because it was an interesting challenge.

If you are in a hurry and just want your site to be searchable, well do what I did before, use Google.

// In search.php file $term = isset($_GET["query"])?$_GET["query"]: ""; $term = urlencode($term); $website = urlencode("www.yourwebsite.com"); $redirect = "https://www.google.com/search?q=site%3A{$website}+{$term}"; header("Location: $redirect"); exit;

What it does is pretty simple. Get the term passed by the user, and forward it to Google search page. Limit the search result to our current domain using the site: keyword in the search query. All your pages that are indexed by Google will be available through search now. If you do want to handle your search in house however, then keep reading.

Homemade Search Solution

Before we go any further, try using the search box on this blog. It uses the same process that I will describe below. If you feel that this is what you want then please continue reading.

This solution is catered to small websites. I make use of LIKE with wild cards on both ends, meaning your search cannot be indexed. This means the solution will work fine for your blog or personal website that doesn"t contain tons of data. Port it to a bigger website and it might become very slow. MySQL offers Full Text Search which is not what we are doing here.

Note: If you have 5000 blog posts you are still fine. .

We will take the structure of this blog as a reference. Each blog post has:

  • A title p_title
  • A url p_url
  • A summary p_summary
  • A post content p_content
  • And catergories category.tagname

For every field that matches with our search term, we will give it a score. The score will be based on the importance of the match:

// the exact term matches is found in the title $scoreFullTitle = 6; // match the title in part $scoreTitleKeyword = 5; // the exact term matches is found in the summary $scoreFullSummary = 5; // match the summary in part $scoreSummaryKeyword = 4; // the exact term matches is found in the content $scoreFullDocument = 4; // match the document in part $scoreDocumentKeyword = 3; // matches a category $scoreCategoryKeyword = 2; // matches the url $scoreUrlKeyword = 1;

Before we get started, there are a few words that do not contribute much to a search that should be removed. Example "in","it","a","the","of" ... . We will filter those out and feel free to add any word you think is irrelevant. Another thing is, we want to limit the length of our query. We don"t want a user to write a novel in the search field and crash our MySQL server.

// Remove unnecessary words from the search term and return them as an array function filterSearchKeys($query){ $query = trim(preg_replace("/(\s+)+/", " ", $query)); $words = array(); // expand this list with your words. $list = array("in","it","a","the","of","or","I","you","he","me","us","they","she","to","but","that","this","those","then"); $c = 0; foreach(explode(" ", $query) as $key){ if (in_array($key, $list)){ continue; } $words = $key; if ($c >= 15){ break; } $c++; } return $words; } // limit words number of characters function limitChars($query, $limit = 200){ return substr($query, 0,$limit); }

Our helper functions can now limit character count and filter useless words. The way we will implement our algorithm is by giving a score every time we find a match. We will match words using the if statement and accumulate points as we match more words. At the end we can use that score to sort our results

Note: I will not be showing how to connect to MySQL database. If you are having problems to efficiently connect to the database I recommend reading this .

Let"s give our function a structure first. Note I left placeholders so we can implement sections separately.

Function search($query){ $query = trim($query); if (mb_strlen($query)===0){ // no need for empty search right? return false; } $query = limitChars($query); // Weighing scores $scoreFullTitle = 6; $scoreTitleKeyword = 5; $scoreFullSummary = 5; $scoreSummaryKeyword = 4; $scoreFullDocument = 4; $scoreDocumentKeyword = 3; $scoreCategoryKeyword = 2; $scoreUrlKeyword = 1; $keywords = filterSearchKeys($query); $escQuery = DB::escape($query); // see note above to get db object $titleSQL = array(); $sumSQL = array(); $docSQL = array(); $categorySQL = array(); $urlSQL = array(); /** Matching full occurrences PLACE HOLDER **/ /** Matching Keywords PLACE HOLDER **/ $sql = "SELECT p.p_id,p.p_title,p.p_date_published,p.p_url, p.p_summary,p.p_content,p.thumbnail, ((-- Title score ".implode(" + ", $titleSQL).")+ (-- Summary ".implode(" + ", $sumSQL).")+ (-- document ".implode(" + ", $docSQL).")+ (-- tag/category ".implode(" + ", $categorySQL).")+ (-- url ".implode(" + ", $urlSQL).")) as relevance FROM post p WHERE p.status = "published" HAVING relevance >

In the query, all scores will be summed up as the relevance variable and we can use it to sort the results.

Matching full occurrences

We make sure we have some keywords first then add our query.

If (count($keywords) > 1){ $titleSQL = "if (p_title LIKE "%".$escQuery."%",{$scoreFullTitle},0)"; $sumSQL = "if (p_summary LIKE "%".$escQuery."%",{$scoreFullSummary},0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",{$scoreFullDocument},0)"; }

Those are the matches with higher score. If the search term matches an article that contains these, they will have higher chances of appearing on top.

Matching keywords occurrences

We loop through all keywords and check if they match any of the fields. For the category match, I used a sub-query since a post can have multiple categories.

Foreach($keywords as $key){ $titleSQL = "if (p_title LIKE "%".DB::escape($key)."%",{$scoreTitleKeyword},0)"; $sumSQL = "if (p_summary LIKE "%".DB::escape($key)."%",{$scoreSummaryKeyword},0)"; $docSQL = "if (p_content LIKE "%".DB::escape($key)."%",{$scoreDocumentKeyword},0)"; $urlSQL = "if (p_url LIKE "%".DB::escape($key)."%",{$scoreUrlKeyword},0)"; $categorySQL = "if ((SELECT count(category.tag_id) FROM category JOIN post_category ON post_category.tag_id = category.tag_id WHERE post_category.post_id = p.post_id AND category.name = "".DB::escape($key)."") > 0,{$scoreCategoryKeyword},0)"; }

Also as pointed by a commenter below, we have to make sure that the these variables are not empty arrays or the query will fail.

// Just incase it"s empty, add 0 if (empty($titleSQL)){ $titleSQL = 0; } if (empty($sumSQL)){ $sumSQL = 0; } if (empty($docSQL)){ $docSQL = 0; } if (empty($urlSQL)){ $urlSQL = 0; } if (empty($tagSQL)){ $tagSQL = 0; }

At the end the queries are all concatenated and added together to determine the relevance of the post to the search term.

// Remove unnecessary words from the search term and return them as an array function filterSearchKeys($query){ $query = trim(preg_replace("/(\s+)+/", " ", $query)); $words = array(); // expand this list with your words. $list = array("in","it","a","the","of","or","I","you","he","me","us","they","she","to","but","that","this","those","then"); $c = 0; foreach(explode(" ", $query) as $key){ if (in_array($key, $list)){ continue; } $words = $key; if ($c >= 15){ break; } $c++; } return $words; } // limit words number of characters function limitChars($query, $limit = 200){ return substr($query, 0,$limit); } function search($query){ $query = trim($query); if (mb_strlen($query)===0){ // no need for empty search right? return false; } $query = limitChars($query); // Weighing scores $scoreFullTitle = 6; $scoreTitleKeyword = 5; $scoreFullSummary = 5; $scoreSummaryKeyword = 4; $scoreFullDocument = 4; $scoreDocumentKeyword = 3; $scoreCategoryKeyword = 2; $scoreUrlKeyword = 1; $keywords = filterSearchKeys($query); $escQuery = DB::escape($query); // see note above to get db object $titleSQL = array(); $sumSQL = array(); $docSQL = array(); $categorySQL = array(); $urlSQL = array(); /** Matching full occurences **/ if (count($keywords) > 1){ $titleSQL = "if (p_title LIKE "%".$escQuery."%",{$scoreFullTitle},0)"; $sumSQL = "if (p_summary LIKE "%".$escQuery."%",{$scoreFullSummary},0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",{$scoreFullDocument},0)"; } /** Matching Keywords **/ foreach($keywords as $key){ $titleSQL = "if (p_title LIKE "%".DB::escape($key)."%",{$scoreTitleKeyword},0)"; $sumSQL = "if (p_summary LIKE "%".DB::escape($key)."%",{$scoreSummaryKeyword},0)"; $docSQL = "if (p_content LIKE "%".DB::escape($key)."%",{$scoreDocumentKeyword},0)"; $urlSQL = "if (p_url LIKE "%".DB::escape($key)."%",{$scoreUrlKeyword},0)"; $categorySQL = "if ((SELECT count(category.tag_id) FROM category JOIN post_category ON post_category.tag_id = category.tag_id WHERE post_category.post_id = p.post_id AND category.name = "".DB::escape($key)."") > 0,{$scoreCategoryKeyword},0)"; } // Just incase it"s empty, add 0 if (empty($titleSQL)){ $titleSQL = 0; } if (empty($sumSQL)){ $sumSQL = 0; } if (empty($docSQL)){ $docSQL = 0; } if (empty($urlSQL)){ $urlSQL = 0; } if (empty($tagSQL)){ $tagSQL = 0; } $sql = "SELECT p.p_id,p.p_title,p.p_date_published,p.p_url, p.p_summary,p.p_content,p.thumbnail, ((-- Title score ".implode(" + ", $titleSQL).")+ (-- Summary ".implode(" + ", $sumSQL).")+ (-- document ".implode(" + ", $docSQL).")+ (-- tag/category ".implode(" + ", $categorySQL).")+ (-- url ".implode(" + ", $urlSQL).")) as relevance FROM post p WHERE p.status = "published" HAVING relevance > 0 ORDER BY relevance DESC,p.page_views DESC LIMIT 25"; $results = DB::query($sql); if (!$results){ return false; } return $results; }

Now your search.php file can look like this:

$term = isset($_GET["query"])?$_GET["query"]: ""; $search_results = search($term); if (!$search_results) { echo "No results"; exit; } // Print page with results here.

We created a simple search algorithm that can handle a fair amount of content. I arbitrarily chose the score for each match, feel free to tweak it to something that works best for you. And there is always room for improvement.

It is a good idea to track the search term coming from your users, this way you can see if most users search for the same thing. If there is a pattern, then you can save them a trip and just cache the results using Memcached .

If you want to see this search algorithm in action, go ahead and try looking for an article on the search box on top of the page. I have added extra features like returning the part where the match was found in the text. Feel free to add features to yours.

Did you like this article? You can subscribe to read more awesome ones. .

On a related note, here are some interesting articles.

It is time to deal with mysql_* functions once and for all. These methods are deprecated and slow. The time to upgrade has long passed yet we still see it everywhere. Since I cannot force every author to update their tutorial and blogs, I decided to write a post to hopefully rank better and provide the essential information to help new comers.

Making your own website shouldn"t be too difficult. Hosting companies like Godaddy or Hostgator make it super easy for anyone to get started; they allow you to create a whole website without ever writing code. For most people, it is plenty to run a WordPress blog. If this is what you are looking for you should head to Godaddy.com right now. We are done here. But on the other hand, if you want to have control and not be limited by the short comings of a shared hosting without busting your wallet, you have come to the right place.

Vim is my favorite text editor on the terminal. After playing for a little while with nano and emacs , I finally settled with vim for its simplicity (bare with me please). Although it can be customized and used like an entire IDE, I use it mostly for editing files on my servers and making small but crucial changes. Let"s not get into Editor war and get started.

Comments(45)

Zaryel Aug 12 2015:

Ian Mustafa Sep 26 2015:

Rob Sep 29 2015:

adeem Feb 11 2016:

Ivan Venediktov Apr 9 2016.

    Добрый вечер!Подскажите стоит ли теперь вообще заполнять мета-тег keywords исходя из нижеописанной политики поисковиков?Представители Яндекса заявили о keywords следующее: «… может учитываться при определении соответствия страницы...

    Есть решение

    Можно ли вносить Meta keywords простым копированием из Excel? Там удобнее обрабатывать ключевики. Можно ли проставить после каждого ключевика запятую, пробел, потом выделить всю колонку, скопировать и вставить в окошко дл Meta keywords? Или нужно...

    Вы можете копировать Meta keywords из Excel, ограничений здесь никаких нет. Что касается двойных пробелов - скрипты лишние пробелы не убирают. Если вручную удалять их долго, то можно скопировать текст в текстовый редактор (Блокнот, например) и выполнить поиск с заменой по всему тексту - дойной пробел заменить на одинарный.

    Добрый день, в ХАБЕ нет возможности менять не title, Keywords, Description в категориях, это так задумано или ошибкаСтатьи ...

    1) Уточните, можно ли на главной странице, на страницах категорий на страницах под категорий и на страницах товаров (на каждой указанной странице) в индивидуальном порядке (в ручном режиме через админку) прописываться title, description, keywords,...

    Добрый день! Сайт в облаке.Необходимо, чтобы мета тег keywords отсутствовал на некоторых страницах. Обращаю внимание: необходимо не задать пустые значения вида , а удалить тег полностью....

    Т.к. в поисковых системах данный мета-тег не используетсяпланируют ли разработчики webasyst убрать его?

    Есть решение

    в теме нельзя делать проверок вроде {if !empty($wa->meta("keywords"))} ... ? Пытаюсь написать {if !empty($wa->meta("keywords"))}

    PHP-функции empty() в качестве аргумента нужно передавать переменную, а не выражение, оттого и ошибка. Вот такое изменение вашего кода устранит ошибку:{$keywords = $wa->meta("keywords")}{if !empty($keywords)} {/if}Хотя ещё логичнее было бы изменить ваш код вот так (вам ведь нужно проверить, есть ли непустая строка в МЕТА-свойстве keywords):{if...

    Есть решение

    Заметил что на сайте (приложение сайт) , не путать с магазином, не выводится у страниц разметка. Зашел на сайт webasyst у них все ок, как ее реализовать, куда какой код вставить? И почему этого нет по умолчанию?

    Сайт - Страницы - Выбрать страницу и наверху Настройки страницы - раздел Соцсети.

    Есть решение

    Здравствуйте!Подскажите, пожалуйста, как вручную отредактировать шаблон по которому создается титл по умолчанию в карточке товара? Допустим, хочу шаблон: "Купить *название раздела* *название товара*, цена *прайс* с доставкой по России". И...

    Попробуйте в начало файла product.html(Магазин-Витрина-Шаблоны) добавить строки:{* New product page title *} {$_category_name = $wa->shop->category($product.category_id|default:null)} {$_category_name = $_category_name.name|default:""} {$_product_name = $product.name} {$_price = shop_currency($product.price)} {$_new_title = sprintf("Купить %1$s %2$s, цена %3$s с доставкой по России", $_category_name, $_product_name, $_price)} {$wa->title($_new_title)} {* /New...

    Есть решение

    Хочу поставить кнопку что бы показывало сколько онлайн человек на сайте, но когда добавляю код в index.html то на сайте пишет страница не найдена, подскажите пожалуйста куда этот код впихнуть?

    +1 shopProductsCollection: проблемы с при`join`неными таблицами На рассмотрении

    Используя shopProductsCollection::addJoin() добавил таблицы, но не получается вывести значения из них используя shopProductsCollection::getProducts($fields). Из $fields удаляются все поля не относящиеся к товару (p.*). Из-за этого также невозможно...

    Создания сайта, для розницы и опта, салона элитной сантехники, плитки и мебели

    Общее ТЗ ниже.Сайт необходимо сделать с нуля, по аналогии с этим under-style.ru 1. Минимизировать, как этот http://www.mercedes-benz.ru...

    Добрый день!Хочу для главной страница прописать ключевики и описание в теги title, keywords, descriptionЗайдя в шаблон index увидел там эти теги, но они ссылаются на какие то блоки

    +2

    суть вот в чем.в настройках категорий есть куча всевозможных значений-элементов-настроек.вот с чем столкнулся.сейчас у меня есть чудо плагины"SEO-оптимизация" и"SEO описание категорий".никто ведь не будет спорить с тем фактом, что...

    Подскажите в каком файле в блоге новостей меняются title, description, keywordsВот например:Март 2017 приход контейнера ОнСилк ― Текстиль для дома в Москве

    Собственно используется тема дефолт-2 Shop-script 5Обратил внимание, что прописанные в бекэнде данные не отображаются (title, keywords & description)вопрос где искать проблему)) и как решать...

    Добрый день, работаю с Вебасистом, задача - сменить метатэги. Проблема в том, что они выводятся неизвестно (для меня) чем и как. Разумеется, я их пытаюсь вбить по пути "Магазин-Товар-Собственно Товар-Вкладка "Описания", где есть...

    Добрый день, у меня вот такая проблема:Товары стоят не так как надо! 1 ряд хорошо а вот последующие почему то не так! Мне нужно исправить данную ошибку чтобы было вот так:Помогите мне исправить данную ошибку. Мне нужно сделать это в ближайшее время...

11.1K

Одна из самых популярных и необходимых функций на любом сайте – это поиск, реализованный с помощью специальной формы. Этот функционал позволяет посетителям быстро находить на сайте интересующий их контент.

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

Разрабатывать формы поиска при помощи PHP , а также познакомитесь с SQL (Structured Query Language ) – специальным языком для сбора, записи и модификации информации, содержащейся в базах данных. Перед тем как начать, рекомендуем вам скачать файлы проекта .

Что вам понадобится

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

Создаем базу данных

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

Самым популярным инструментом для управления MySQL является PHP My Admin , Этого инструмента будет достаточно для нашего сегодняшнего руководства.

Создание таблицы

Наша таблица должна быть создана в следующем формате:

Column Name Data Type Length Null or Not Null Primary key? Auto Increment
ID INT 1 Not Null Yes Yes
FirstName Varchar 50 Not Null No No
LastName Varchar 50 Not Null No No
Email Varchar 50 Not Null No No
PhoneNumber Varchar 15 Not Null No No

Таблица базы данных состоит из столбцов и строк, как в Excel . Первый столбец позволяет идентифицировать данные по имени. Далее идет колонка Data types (тип данных ), которая указывает нам на тип данных, содержащихся в колонке. В поле Length (Длина ) указывается максимальный объем памяти (хранилища ) для столбца таблицы. Мы используем переменные, которые дают больше гибкости. Другими словами, если длина ФИО меньше 50 символов, то будет занята лишь часть отведенного места.

И среди данных персонала не может быть пустых значений (null, empty ). Первая строка выделена желтым цветом, потому что столбец ID – наш основной ключ. Основной ключ в базе данных гарантирует, что каждая запись будет уникальной. К этой колонке также применен автоинкремент, а это значит, что каждой записи в нашей базе данных будет присваиваться уникальный номер автоматически.

Вносим представителей персонала в таблицу

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

Column ID FirstName LastName Email PhoneNumber
2 Ryan Butler [email protected] 417-854-8547
3 Brent Callahan [email protected] 417-854-6587

Разработка формы

Чтобы создать форму поиска по сайту через Google , откройте любой подходящий текстовый редактор. Я рекомендую воспользоваться бесплатным PSPad . Вы можете использовать любой текстовый редактор, где предусмотрена подсветка синтаксиса. Это в значительной степени облегчит процесс написания и отладки PHP-кода . Создавая страницу для формы поиска, не забудьте сохранить ее в формате .php , иначе PHP-код не будет обрабатываться должным образом. Как только сохраните документ, скопируйте в него следующую разметку:

Поиск контактов:

Детальный поиск контактов

Вы можете искать по имени или фамилии

Если вы знакомы с языком HTML , то тут вам все должно быть понятно как минимум до открывающего тега form . Внутри этого тега находится важнейший элемент всего кода – атрибут action . В качестве действия нашей формы мы указали название нашего файла, а затем применили к нему строку запроса “go ”.

Проверка на соответствие критерию

Когда пользователь вводит имя или фамилию, а затем нажимает кнопку подтверждения, форма передает данные самой себе и добавляет в конце строку запроса “go ”. На данном этапе мы проверяем наличие строки запроса go . Если результат положительный, выводим результаты поиска.

До вывода запрашиваемых результатов нам нужно перепроверить: (1) была ли подтверждена форма, (2) содержит ли строка запроса значение go, (3) был ли поисковой запрос введен в нижнем или верхнем регистре? Если ни одна из проверок не дает положительного результата (true ), то от нас не требуется выполнять какие-либо действия.

Для начала добавим небольшой блок кода PHP поиск по сайту после закрывающего тега :

Сначала мы открываем блок PHP-кода тегом ””.

Любой PHP-код внутри этой пары тегов будет исполняться сервером. Затем мы проверяем, была ли подтверждена форма:

Введите поисковый запрос

"; } ?>

Мы воспользуемся встроенной функцией isset , которая возвращает значение типа bool , и поместим в нее массив $_POST . Логическое выражение в программировании позволяет получить нам либо true , либо false .

Следовательно, если функция возвращает значение true , то форма была подтверждена, и нам нужно продолжить выполнение кода дальше. Если же функция возвращает значение false , то мы выведем сообщение об ошибке. Сохраните весь набранный код в файле search_submit.php .

Введите поисковый запрос

"; } } } ?>

Мы вкладываем еще одно условное логическое выражение внутрь основного, но только в этот раз мы используем массив $_GET вместе со значением “go ”. Сохраните изменения в файле search_go.php .

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

Мы вкладываем еще одно условное логическое выражение внутрь наших двух. На этот раз мы используем регулярное выражение для проверки ввода. Мы используем встроенную функцию preg_match с двумя параметрами: регулярное выражение, и поле формы, к которому должна применяться проверка.

В нашем случае, это будет поле «Имя » (name ). Чтобы извлечь параметры поиска, указанные посетителем, мы создаем переменную $name, и привязываем к ней значение POST с названием поля из формы, которое будет использоваться в SQL-запросе . Сейчас мы реализовали: (1) отправку данных формы, (2) строка запроса включает значение go и (3) посетитель ввел либо заглавную, либо строчную первую букву. И все эти проверки происходят еще до внесения изменений в базу данных. Сохраните все изменения.

Результаты Connect, Select, Query и Return из таблицы базы данных

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

", "") or die (" Я не могу подключиться к базе данных, так как: " . mysql_error()); else{ echo "

Пожалуйста, введите поисковый запрос

"; } } }?>

Мы создаем переменную $db , и привязываем ее к встроенной функции MySQL mysql_connect , которая принимает три параметра: сервер с базой данных (localhost , если вы работаете локально ), логин и пароль.

После этого мы запускаем встроенную PHP-функцию die , которая останавливает дальнейшее выполнение кода, если нет соединения с базой данных. И выводим информацию об ошибке, запуская встроенную функцию MySQL mysql_error , которая вернет причину ошибки. Сохраните файл search_connectdb.php .

Пожалуйста, введите поисковый запрос

"; } } } ?>

Создаем переменную под названием mydb и привязываем ее ко встроенной MySQL-функции mysql_select_db , а затем указываем название базы данных, которую создали ранее. Далее мы опрашиваем таблицу базы данных при помощи SQL-запроса с переменной name, в которой содержатся параметры поиска, введенные посетителем:

Пожалуйста, введите поисковый запрос

"; } } } ?>

При опросе таблицы базы данных мы создаем переменную $sql , и привязываем ее к строке, содержащей SQL-запрос . Мы используем оператор SELECT для извлечения значений из столбцов id , а также имени и фамилии из таблицы contacts . Затем мы используем инструкцию WHERE вместе со значениями имени и фамилии, чтобы сузить поиск.

Вместе с оператором LIKE мы используем знак процента (%) – спецсимвол, который возвращает 0 и более знаков, а также переменную name из строки поиска. В результате LIKE (в сочетании со спецсимволом ) находит любое соответствующее имя в таблице базы данных. Можно описать весь процесс следующим образом: «Мы выбираем имя и фамилию из таблицы contacts , которые соответствуют введенным посетителем ». Сохраните файл search_query.php .

Пожалуйста, введите поисковый запрос

"; } } } ?>

Мы создаем переменную $result , и присваиваем ей значение функции mysql_query () , внося ее в $query. Теперь наш запрос хранится в переменной result . Чтобы вывести результат в PHP , мы создаем цикл, а затем выводим данные в неупорядоченном списке:

n"; echo "

  • " . "
  • n"; echo ""; } } else{ echo "

    Пожалуйста, введите поисковый запрос

    "; } } } ?>

    Сначала мы создаем цикл while , внутри него создаем переменную под названием row , и инициализируем ее возвращаемым значением функции mysql_fetch_array , которая принимает переменную result , в которой находится наш SQL-запрос . Внутри цикла while мы присваиваем каждому значению столбца значение переменной с идентичным названием. Затем мы выводим значения внутрь неупорядоченного списка.

    Здесь важно обратить внимание на два момента: (1) внутри цикла while не нужно присваивать значения переменным массива row , так как значения можно брать напрямую из массива row ; (2) тег anchor , который мы используем в названии нашего файла вместе с id и основным ключом. Причина этого заключается в том, что во многих поисковых элементах изначально ничего не отображается.

    Так как мы показываем только имя и фамилию, приписывая ID в конце нашего тега anchor , то мы можем использовать ID для дополнительного запроса, который позволит вывести дополнительную информацию о персонале. Сохраните файл и протестируйте форму PHP поиска по сайту (search_display.php ).

    Убираем табуляцию

    Результаты выводятся в виде неупорядоченного списка, но суть в том, что нам не нужна табуляция. Чтобы избавиться от нее, добавьте следующее CSS-правило в самое начало вашего файла в head :

    Поиск по буквам

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

    Добавьте следующую строку кода после закрывающего тега form :

    A | B | K

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

    }//Окончание скрипта поисковой формы if(isset($_GET["by"])){ $letter=$_GET["by"]; //Подключение к базе данных $db=mysql_connect ("servername", "username", "password") or die ("Я не могу подключиться к базе данных, так как: " . mysql_error()); //-Выберете базу данных $mydb=mysql_select_db("yourDatabase"); //-Запрос к таблице базы $sql="SELECT ID, FirstName, LastName FROM Contacts WHERE FirstName LIKE "%" . $letter . "%" OR LastName LIKE "%" . $letter ."%""; //-Запустить запрос к функции MySQL Query $result=mysql_query($sql); //-Результаты подсчета $numrows=mysql_num_rows($result); echo "

    " .$numrows . " results found for " . $letter . "

    "; //-Запуск цикла и сортировка результатов while($row=mysql_fetch_array($result)){ $FirstName =$row["FirstName"]; $LastName=$row["LastName"]; $ID=$row["ID"]; //-Вывести результат в массиве echo "
      n"; echo "
    • " . "" .$FirstName . " " . $LastName . "
    • n"; echo "
    "; } }

    Здесь мы изменили четыре фрагмента кода скрипта поиска по сайту:

    • Мы используем функцию isset() , и вносим в нее массив $_GET , а затем проверяем значение by ;
    • Создаем переменную $letter и инициализируем ее значение массивом $_GET ;
    • Добавляем переменную letter в SQL-запрос ;
    • Указываем переменную letter внутри выражения, в котором получаем подсчитанное количество строк.

    Сохраните файл search_byletter.php и проверьте результат.

    Поиск определенного сотрудника

    Чтобы отобразить информацию об остальном персонале, которая передается через уникальное id внутри нашей ссылки, нужно добавить следующий код прямо после закрывающей фигурной скобки в скрипте letter , как показано ниже:

    }//Окончание скрипта if(isset($_GET["id"])){ $contactid=$_GET["id"]; //Подключение к базе данных $db=mysql_connect ("servername", "username", "password") or die ("Я не могу подключиться к базе данных, так как: " . mysql_error()); //-select the database to use $mydb=mysql_select_db("yourDatabase"); //- Запрос к таблице базы данных $sql="SELECT * FROM Contacts WHERE ID=" . $contactid; //- Запустить запрос к функции mysql_query() $result=mysql_query($sql); //- Запуск цикла и сортировка результатов while($row=mysql_fetch_array($result)){ $FirstName =$row["FirstName"]; $LastName=$row["LastName"]; $PhoneNumber=$row["PhoneNumber"]; $Email=$row["Email"]; //- Вывести результат в массиве echo "

    "; } }

    Здесь мы изменили четыре фрагмента кода:

    • Мы используем функцию isset() , и с ее помощью проверяем значение ID в массиве $_GET ;
    • Создаем переменную $contactid и инициализируем ее массивом $_GET ;
    • В таблице выделяем все, что отмечено звездочкой * . Звездочка – это сокращенное обозначение в SQL , которое означает «дайте мне все столбцы и строки из таблицы» . Чтобы определить, какую информацию выводить, мы упоминаем переменную contactid в конце SQL-выражения ;
    • Выводим дополнительную информацию о каждом представителе персонала.

    Сохраните файл search_byid.php и проверьте результат.

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

    SQL-инъекция

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

    "DROP TABLE

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

    В завершение

    В сегодняшней статье мы рассмотрели, как сделать поиск по сайту, а также:

    • Создавать базы данных и соответствующие таблицы;
    • Использовать инструменты для управления базами данных, создавать столбцы и вводить данные;
    • Разрабатывать формы поиска на основе PHP , которая умеет осуществлять проверку вводимых данных, наличия переменных в запросе, а также соединяться с базой данных и выводить результаты из таблицы;
    • Как защитить приложение и базу данных от SQL-инъекций .

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

    Данная публикация представляет собой перевод статьи «How to Create a Search Feature with PHP and MySQL » , подготовленной дружной командой проекта

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

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

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

    Пожалуй, это лучший сервис для подбора ключевых слов для продвижения в Google, потому что это “родной” гугловский сервис. Он подходит как для рунета, так и для англоязычного интернета, нужно лишь выбрать нужную страну и язык:

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

    В этом сервисе есть опции, которые позволяют подбирать запросы как для настольных компьютеров и ноутбуков, так и для мобильных устройств:

    Я советую активировать все колонки для получения информации по ключевым словам. Для этого в правой части страницы кликните на кнопке “Столбцы” (Columns)и отметьте все галочки: Уровень конкуренции (Competition), количество запросов в месяц для всего мира (Global Monthly Searches) и целевых регионов (Global Local Searches), Доля показов объявления (Ad Share), Поисковая сеть Google (Google Search Network), Доля показов на первой странице (Search Share), Приблизительная цена за клик (Approximate CPC (cost-per-click bid)), Динамика запросов в целевых регионах (Local Search Trends graph), Содержание веб-страницы (Extracted From Webpage).

    Вот скриншот в английском интерфейсе, в котором я предпочитаю работать:

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

    Еще рекомендую поиграть с типом соответствия в левой колонке для получения желаемых результатов и дополнительных идей по поисковым запросам (попробуйте собирать ключи, поочередно отмечая галочки “Точное” (Exact), “Широкое” (Broad) и “Фразовое” (Phrase)).

    Полученные данные можно сохранить в формате CSV (а также в нескольких других форматах), для этого кликните по кнопке “Сохранить в файл” (Save to file). Я искренне советую использовать этот сервис, так как он имеет все необходимые функции для сбора ключевых слов.

    Полезный и бесплатный сервис для сбора ключевых слов, который использует Google Suggest и другие ресурсы. Можно выбрать страну и источник (Веб, Новости, Шоппинг, Видео или Рецепты). Ubersuggest дает возможность получать поисковые запросы как из обычного поиска, так и из вертикального. Этот ресурс работает по следующей схеме: он берет введенный вами запрос, добавляет к нему букву или цифру и собирает все возможные запросы. Таким образом, вы получаете возможность найти больше идей по ключевым словам, особенно по низкочастотным запросам.

    Например, я собрал 344 поисковых запроса для фразы “search engine optimization” и 377 для “photoshop tutorials”.

    Сохранение полученных данных сделано оригинально. Кликаете на кнопке “Select all keywords”. Кстати, как вам мой новый водяной знак? Как говорят во Флориде - Стайл! :

    Потом щелкаете на кнопке “Get” в правой части:

    И появится окно со всеми собранными ключевыми словами.

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

    Я обнаружил, что сервис Youtube Keyword Tool некорректно работает и для многих запросов показывает сообщение о том, что недостаточно данных. Я придумал такое решение - зарегистрируйте или войдите в свой аккаунт Google AdWords и вставьте ссылку на видео, которое подходит по тематике для ваших ключевых слов. Затем установите цену в $0.01 за просмотр и вы получите все возможные поисковые фразы. Также советую поиграть с типом соответствия Broad, Phrase and Exact (Широкое, Фразовое и Точное) для получения максимальных результатов.

    Еще один полезный инструмент для сбора ключевых фраз от Google. Он позволяет сравнивать данные по категориям, странам и периодам времени. Можно применять фильтры Web Search, Image Search, News and Product Search.

    В Google Insights есть еще одна любопытная функция - вы можете смотреть динамику запросов по времени и на карте мира (кликните на пункт “Просмотреть изменение во времени”, там даже можно включить анимацию):

    Например, я выяснил, что запрос “search engine optimization” в 2004 году был наиболее популярен в США, а сейчас страна, где больше всего запрашивают эту фразу - Индия.

    Классный сервис для сбора поисковых фраз, который к тому же бесплатен. Он показывает данные с популярных мировах интернет ресурсовt (Google. Amazon, Wikipedia, Answers.com, Yahoo, Bing, Youtube, Netflix, Ebay, Buy.com, Weather.com) и выводит фразы в оригинальной манере по мере того, как вы набираете свой запрос в нем. Попробуйте, вам понравится!

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

    Известный аналитический ресурс Alexa.com, с помощью которого можно бесплатно найти поисковые запросы того или иного сайта. Идем на Alexa.com, выбираем вкладку Site Info и вводим адрес интересующего нас сайта. Затем кликаем на кнопке Get Details:

    На следующей странице выбираем вкладку Search Analytics:

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

    Сервис подбора поисковых запросов поисковика Bing позволяет бесплатно собрать данные с органического поиска и изучить статистику за последние 6 месяцев. Можно фильтровать полученные запросы по языкам и странам. Для того, чтобы воспользоваться этим сервисом, нужно зарегистрироваться в нем.

    Еще один бесплатный сервис для сбора ключевых слов от Google. Можно сравнивать несколько запросов, для этого пишите их, разделяя запятой. Можно сравнивать до 5 запросов.

    Отличный генератор поисковых запросов, который берет данные с Google, Yahoo и Wordtracker. Например, я получил 46 ключевых фраз для “photoshop tutorials”.

    Название этого сервиса можно перевести как “Yahoo Догадки” . Все данные по ключевым словам получаются с поисковика Yahoo. Можно находить специфические поисковые запросы по тематике спортивных лиг, спортивных команд и спортсменов. Есть функция сравнения запросов, которые набирают мужчины и женщины. Также можно фильтровать ключи по странам.

    И еще один бесплатный инструмент от Google. Google Corellate позволяет находить ключевые фразы на основе популярных мировых трендов, что может быть очень полезно для многих вебмастеров и оптимизаторов.This free online tool finds search patterns which correspond with real-world trends, which is very useful for SEO specialists and website owners.

    Google Correllate также показывает карты поисковой активности. Например, я использую его для того, чтобы узнать популярность того или иного запроса в различных штатах США. Просто наводите курсор на нужный штат, и увидите информацию по нему. Я навел на свою любимую Флориду, где я прожил 4 года:

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

    Я пару раз встречал, что в рунете название этого инструмента переводят как “Тупо генератор” . На самом деле это генератор опечаток. Часть запросов пользователи всегда вводили, вводят и будут вводить с опечатками. Поэтому опечатки можно использовать для получения дополнительных целевых посетителей. Этот инструмент как раз позволяет получать ключевые запросы с опечатками.

    Расширения для браузеров для поиска ключевых слов

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

    Я активно использую SeoQuake с 2007 года. Это расширение доступно для браузеров Google Chrome, Mozilla Firefox, Opera и Safari.

    С расширением SeoQuake очень легко анализировать плотность ключевых слов на любой странице сайта. Для этого заходите на интересующую вас страницу, кликаете на иконку SeoQuake и выбираете пункт Keyword Density:

    На следующей странице вы увидите детальную информацию о том, какие ключевые слова используются для оптимизации данной страницы:

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

    Я нашел видео, которое подробно показывает этот процесс в SeoQuake:

    KGen (сокращение от Keyword Generator) - это SEO аддон для браузера Mozilla Firefoх, который позволяет вам узнать, какие поисковые запросы использованы на той или иной странице для ее оптимизации. Суть такая же, как и у предыдущего расширения.

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

    Для подбора ключевых слов просто заходите на нужную страницу, кликайте по иконке KGen (у меня она находится в правой нижней части браузера Firefox) и в появившемся окне нажимайте кнопку “Сканировать”.

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

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

    Например, вы можете узнать, по каким запросам интересующий вас конкурент продвигает ту или иную внутреннюю страницу своего сайта. Для этого заходите во вкладку SERP’s Analysis, выбирайте Organic Keywords и вводите адрес нужной страницы. Вы бесплатно получите 10 поисковых запросов, по которым данная страница находится в выдаче Google. Доступны данные не только по Google, но и для Bing и Yahoo.

    Я делал подробный видеообзор возможностей сервиса Ahrefs.com на 40 с лишним минут в этом посте: Как изучать сайты конкурентов с помощью сервиса Ahrefs.com - видеоурок .

    В бесплатном варианте Wordtracker выдает до 100 поисковых запросов. Прошу учесть, что он показывает частоту показов за день. Если вам нужны данные за месяц (как мне), то просто умножайте полученные результаты на 30.

    Еще один полезный инструмент от сервиса Wordtracker. Вводите запрос, и получите 100 вопросов, которые к нему подходят. Это хорошее подспорье при поиске новых идей по ключам и написании статей. Вопросы можно использовать при составлении заданий копирайтерам.

    Сервис от известного в рунете блоггера Димка . Actual Keywords позволяет бесплатно получить 100 ключевых слов по любому запросу. Еще для бесплатного скачивания доступны выборки ключевых слов по нескольким тематикам (Auto Loan, Digital Camera, What Is и How To).

    Популярный сервис Semrush позволяет бесплатно вводить 10 запросов в день и получать 10 результатов на каждый запрос. Этот сервис обладает собственной базой данных, которая состоит из 95 миллионов ключевых слов и 45 миллионов сайтов.

    Как и другие бесплатные версии платных сервисов, Keyword Discovery выдает 100 поисковых запросов. Данные собираются с более чем 200 ресурсов по всему миру.

    Еще один способ получить 100 запросов бесплатно. Доступны данные из Google по нескольким странам: AU, BR, CA, DE, ES, FR, IT, RU, UK и US.

    У Keyword Eye я нашел интересную функцию - облако поисковых запросов. Вот как оно выглядит:

    Wordpot показывает данные с различных поисковых систем по частоте показов за день.

    Бесплатно этот сервис позволяет создать 1 проект и сделать 25 запросов в день. Синонимы, похожие запросы и ассоциативные слова также ограничены - до 5 в день.

    Если вы участвуете в партнерской программе Amazon.com, то этот сервис позволит находить поисковые запросы именно из Амазона, что особенно ценно для поиска специфических низкочастотных запросов. Учтите, что в бесплатной версии можно вводить только 3 запроса в день.

    Как и другие вышеперечисленные сервисы, WordStream выдает нам 100 запросов бесплатно. Огорчает, что полученные данные нельзя скачать. Но зато можно отправить их на свой e-mail. Хотя этот момент мне лично не нравится - вдруг будет приходить ненужная мне новостная рассылка?

    Этот сервис собирает данные с eBay.com. Вводите нужный запрос и получаете такую таблицу (там еще есть информация, я не стал ее запечатлевать на скриншоте, чтобы детально показать именно эту таблицу):

    Этот сервис напоминает мне закрытый проект от Google - Wonder Wheel. Похож, не правда ли?

    Terapeak позволяет находить поисковые запросы для отдельных стран. Есть бесплатный пробный период на 7 дней.

    И еще один способ бесплатно получать 100 ключевых слов. Я не нашел способа, как сохранить полученные данные, потому этот сервис уступает тем, которые я описал выше.

    Niche Bot выдает 20 поисковых запросов в день.

    А этот - только 10. Чем меньше запросов выдает сервис бесплатно, тем меньше я о нем пишу . Будет выдавать 1 запрос - просто поставлю точку вместо описания .

    А этот инструмент выдает 100 запросов. Например, я ввел “Photoshop tutorials” и получил 110 фраз. Но после ввода второго запроса я получил сообщение о достижении суточного лимита “You have reached your daily limit”. В бесплатном варианте вы не можете скачать отчет по собранным ключевым словам, но вы можете выделить его мышкой и скопировать, хотя это нет так удобно.

    Этот сервис позволяет узнать Keyword Effectiveness Index (KEI), то есть индекс эффективности ключевого слова, а также собрать запросы интересующих вас сайтов. В нем есть еще модуль сбора ключевых слов, по которым тот или иной сайт находится в поисковой выдаче. У Wordze есть бесплатный период на 30 дней.

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

    Бесплатные программы для поиска ключевых слов

    Полезная бесплатная программа для Windows. Данные собираются с сервиса подбора слов Google.

    Эта программа позволяет подбирать поисковые запросы прямо в интерфейсе Microsoft Excel, что очень удобно для многих пользователей. Данные собираются из поисковиков Bing и Yahoo и включают в себя релевантность, историю стоимости, частоту показов, а также данные по странам.

    Честно говоря, когда я установил программу Microsoft Advertising Intelligence, я не сразу понял, как ее запустить. На рабочем столе ярлыка нет, в списке программ я ее тоже не нашел. И только после того, как я запустил Excel, я увидел новую вкладку . Я сделал скриншот выше, на котором вы можете ее увидеть.

    Платные программы для подбора слов с бесплатной пробной версией

    Проект Good Keywords создал еще одно решение для поиска ключевиков - программу Keyword Strategy Studio. Она позволяет находить новые идеи для поисковых запросов, которые основаны на данных поиска, трендах и популярности. Keyword Strategy Studio имеет полнофункциональную пробную версию, которой можно пользоваться в течение 30 дней.

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

    Keyword Researcher - это дословно “Исследователь ключевых слов”. Эта программа хорошо подходит для поиска низкочастотных поисковых запросов с низкой конкуренцией и работает на Windows и Apple OS X. На скриншоте видно, что можно задать шаблон поискового запроса, заменив одно слово или фразу звездочкой, и программа подберет все возможные варианты ключевых слов. Например, делаем такой запрос:

    How to * a camera

    И программа подбирает 119 фраз по этому шаблону. Есть бесплатный период. Предлагаю посмотреть видео о ее возможностях:

    У этой программы есть бесплатная версия, которая имеет много интересных функций. Например, мне понравился модуль Amazon keyword scraper (для сбора ключевых слов с Amazon.com). Смотрим скриншот:

    Можно задавать различные фильтры при поиске ключевых слов и фраз, можно одним кликом удалять названия брендов, задавать диапазон локальных показов запросов и мировых показов, а также задавать параметры средней стоимости клика (CPC). Также, как и в Google Adwords, можно указывать тип соответствия (точное, широкое и фразовое).

    Программа Advanced Web Ranking предоставляет весь свой функционал в течение всего бесплатного пробного периода в 30 дней и работает на операционках Windows, Mac OS X и Linux.

    Модуль подбора ключевых слов в Rank Tracker позволяет определять уровень конкуренции, находить слова с опечатками и т.д. Данные собираются с Google AdWords, Yandex Wordstat, Keyword Discovery, Wordtracker, Bing и Semrush. Вы можете бесплатно использовать Rank tracker, но при этом вы не сможете сохранять проекты и отчеты. Программа работает на Windows, Mac OS X и Linux.

    Я хочу еще упомянуть два популярных инструмента для подбора поисковых запросов - Micro Niche Finder (программа) и Keyword Ninja (PHP скрипт), но у них нет бесплатного пробного периода, поэтому я не включил их в список, привожу для информации. У Micro Niche Finder есть период в 30 дней, но за него нужно платить, поэтому он не является бесплатным.

    Sphinxsearch является поисковым движком для быстрого fulltextsearch, может получать данные из mysql, oracle и mssql, может выступать сам хранилищем(realtime индексы). Также sphinx имеет режим работы через api и через sphinxql - аналог протокола sql(с некоторыми ограничениями), что позволяет подключить поиск через sphinx на сайте с минимальным изменением кода. Это один из немногих великих, крупных и открытых проектов разработанный в России. На моей жизни я видел как sphinx обрабатывает порядка 100-200 поисковых запросов на 2 миллиона записей из mysql и при этом сервер свободно дышал и его не тошнило, mysql начинает умирать уже на 10 запросах в секунду на аналогичном конфиге.

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

    Sphinx содержит две независимые программы indexer и searchd. Первый строит индексы по данным взятым из базы данных, второй производит поиск по построенном индексу. А теперь перейдем к настройкам поиска в sphinx.

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

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

    Для английского слова “dogs” и “dog” будут нормализованы к “dog”.
    К примеру в sphinx должен положить в индекс слово кучерявый, в индекс попадет слово кучеряв и будут находиться вариации кучеряво, кучерявая и др.
    Включить стемминг можно для русского, английского или обоих языков

    Morphology = stem_en
    morphology = stem_ru
    morphology = stem_enru

    Также можно использовать опции Soundex и Metaphone они позволяют использовать для английского языка с учетом звучания слов. Не использую в работе данные алгоритмы морфологии так что если кто то знает много про них буду рад почитать. Для русского языка такие алгоритмы позволяли бы получать из слов “солнце” и “сонце” нормализованную форму “солнце”, которая получается на основании звучания и произношения этих слов.

    Morphology = stem_enru, Soundex, Metaphone

    Можно подключать и внешние движки для морфологии или написать свой.

    Wordforms

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

    Core 2 duo > c2d
    e6600 > c2d
    core 2duo > c2d

    Позволит найти статью о core 2 duo для любого поискового запроса от модели до вариаций названия.

    Конопля > травка
    дурь > травка
    моя прелесть > травка
    трава свободы > травка
    че покурить > травка
    есть чё > травка

    А данный словарь позволит вашим пользователя легко найти информацию о травке на сайте.

    Для словоформ используются файлы в формате ispell или MySpell(которые можно сделать в Open Office)

    Wordforms = /usr/local/sphinx/data/wordforms.txt

    enable_star

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

    Enable_star = 1

    expand_keywords

    Автоматически расширяет поисковый запрос до трех запросов

    Running -> (running | *running* | =running)

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

    Expand_keywords = 1

    index_exact_words

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

    К примеру есть три слова “дыня”, “дыне”, “дыню” без этой опции все три слова будут сохранены в индексе как дын и на запрос “дыне” будут выданы в порядке добавления в индекс то есть “дыня”, “дыне”, “дыню”.
    Если же включить опции expand_keywords и index_exact_words то на запрос “дыне” будет более релевантная выдача “дыне”, “дыня”, “дыню”.

    Index_exact_words = 1

    min_infix_len

    Позволяет индексировать части слова инфиксы, и искать по ним с применением *, вроде search*, *search и *search*.
    К примеру при min_infix_len = 2 и попаданию в индекс слова “тест”, будут сохранены в индекс “те”, “ес”, “ст”, “тес”, “ест”, “тест” и по запросу “ес” будет найдено это слово.

    Обычно я использую

    Min_infix_len = 3

    Меньшее значение генерит слишком много мусора и помните что использование этой опции сильно увеличивает индекс.

    min_prefix_len

    Является дочерним для min_infix_len и делает почти тоже самое только сохраняет начало слов или префиксы.
    К примеру при min_infix_len = 2 и попаданию в индекс слова “тест”, будут сохранены в индекс “те”, “тес”, “тест” и по запросу “ес” будет найдено это слово.
    min_prefix_len = 3

    min_word_len

    Минимальный размер слова для индексации, по умолчанию 1 и индексирует все слова.
    Обычно использую
    min_word_len = 3
    Слова меньшего размера обычно не несут смысловой нагрузки.

    html_strip

    Вырезает все html теги и html комментарии. Эта опция актуально если вы строите свой google/yandex на базе sphinxsearch. Запустили спайдера спарсили сайт, загнали его в базу данных, натравили indexer и эта опция позволит избавиться от хлама в виде html тегов и искать только по контенту сайта.

    Сам к сожалению не использовал, но в документации написано что может косячить со всякими xml и не стандартным html(к примеру где попало открывающимся и закрывающимся тегам и пр).

    Буду рад любым вопросам и уточнениям.
    Офсайт