Умный поиск в WordPress. Плагин Search Unleashed. Полнотекстовый поиск wordpress
Microsoft SQL Server. Основы полнотекстового поиска (Full-Text Search)
Автор: Вячеслав
Не буду описывать, что такое полнотекстовый индекс, хотя немного можно цитатой из BOL:
“Полнотекстовые запросы выполняют лингвистический поиск в текстовых данных в полнотекстовых индексах путем обработки слов и фраз в соответствии с правилами данного языка, например английского или японского. Полнотекстовые запросы могут включать простые слова и фразы или несколько форм слова или фразы.”
Для работы полнотекстового поиска необходимо, чтобы работала служба MSSQLFDLauncher (fdhost.exe), которая необходима для фильтрации, разбиения по словам данных из таблиц.
В отличие, от MS SQL 2005, задачи которые выполнялись службой MSFTESQL , теперь выполняются процессом sql server.
Создание полнотекстового индекса выполняется по следующим шагам:
- Создание полнотекстового каталога
- Создание полнотекстового индекса
- Заполнение полнотекстового индекса
- Итак, создадим полнотекстовый каталог:
Его можно создать либо из графического интерфейса(БД->Storage ->Full Text Catalogs), либо командой t-sql:
CREATE FULLTEXT CATALOG [test_catalog]WITH ACCENT_SENSITIVITY = ON AS DEFAULT AUTHORIZATION [dbo]
CREATE FULLTEXT CATALOG [test_catalog]WITH ACCENT_SENSITIVITY = ON
AS DEFAULT
AUTHORIZATION [dbo] |
- Создание полнотекстового индекса:
CREATE FULLTEXT INDEX ON [Production].[ProductDescription] (Description language 1033)KEY INDEX [AK_ProductDescription_rowguid] ON([test_catalog]) WITH (CHANGE_TRACKING MANUAL) GO
CREATE FULLTEXT INDEX ON [Production].[ProductDescription]
(Description language 1033)KEY INDEX [AK_ProductDescription_rowguid] ON([test_catalog])
WITH (CHANGE_TRACKING MANUAL)
GO |
Где Description language 1033 язык данных ключа уникального индексе AK_ProductDescription_rowguid , который будет проиндексирован. Список поддерживаемых языков для полнотекстового индексирования можно получить из представления sys.fulltext_languages.
CHANGE_TRACKING MANUAL –устанавливаем, что обновление индекса будет
Индекс создан, сами полнотекстовые индексы модно получить из представления sys.fulltext_indexes.
- После этого можно наш индекс заполнять данными.
При создание индекса, индекс заполняется автоматически, так же при создание мы указываем тип обновления индекса, в примере:
WITH (CHANGE_TRACKING MANUAL) – обновление вручную
Еще варианты AUTO и OFF.
Рекомендуется запускать настраивать индекс с параметром “Manual”, но если таблица, на которую настроен полнотекстовый индекс, обновляется мало, можно и “AUTO”. Дело в том , что обновление полнотекстового индекса происходит немного по другому, в отличие от кластерных \не кластерных индексов.
Заполнение индекса новыми данными или обновление информации , выполняется командой:
alter fulltext index on Production.ProductDescription START FULL POPULATION
alter fulltext index on Production.ProductDescription START FULL POPULATION |
Запросы с полнотекстовым индексом:
Самый простой способ – это использование freetext и CONTAINS
select * from Production.ProductDescription where freetext(Description,'bike') go select * from Production.ProductDescription where CONTAINS (Description,'bike')
select * from Production.ProductDescription
where freetext(Description,'bike')
go
select * from Production.ProductDescription
where CONTAINS (Description,'bike') |
Разница, что например для второго запроса не выдадут результаты со словом , например, “bikes”.
Еще одно замечание, по умолчанию при создание индекса, если явно не указано, индекс сопоставляется с системным стоп-листом “system”, п о этому стоп-листу не будут находиться , например, числовые значение(раз, два и т.д.)
Указать стоп лист можно либо при создание полнотекстового индекса, либо если уже индекс командой:
alter fulltext index on Production.ProductDescription set stoplist=test_stlist
alter fulltext index on Production.ProductDescription set stoplist=test_stlist |
Еще несколько примеров по запросам к полнотекстовым каталогам:есть таблица со следующими данными:id val1 раз2 Раз3 Раз два4 Раз, два5 Разовый, два6 Разовый, двоичный7 тРи8 раз два три четеры9 Раз, два, три, четыре10 Раз, два, три, четыре, пять11 Первый второй третий12 стоп13 стоп два раза14 стоппп15 стоп — стоять16 стоп снова17 два, раз, ноль18 два, раз19 два, ноль, раз
1-й запрос к данной таблице:
SELECT [id],[val] FROM [test_db].[dbo].[tbl_rusful] where CONTAINS(val,'Раз')
SELECT [id],[val] FROM [test_db].[dbo].[tbl_rusful]
where CONTAINS(val,'Раз') |
Результат:id val1 раз2 Раз3 Раз два4 Раз, два8 раз два три четеры9 Раз, два, три, четыре10 Раз, два, три, четыре, пять17 два, раз, ноль18 два, раз19 два, ноль, раз
2-ой запрос:
SELECT [id],[val] FROM [test_db].[dbo].[tbl_rusful] where CONTAINS(val,'"Раз" and "Два"')
SELECT [id],[val]
FROM [test_db].[dbo].[tbl_rusful]
where CONTAINS(val,'"Раз" and "Два"') |
Результат:id val3 Раз два4 Раз, два8 раз два три четеры9 Раз, два, три, четыре10 Раз, два, три, четыре, пять17 два, раз, ноль18 два, раз19 два, ноль, раз
3 -й запрос:
SELECT [id],[val] FROM [test_db].[dbo].[tbl_rusful] where CONTAINS(val,'"Раз*" near "Два"')
SELECT [id],[val]
FROM [test_db].[dbo].[tbl_rusful]
where CONTAINS(val,'"Раз*" near "Два"') |
Результат:id val3 Раз два4 Раз, два5 Разовый, два8 раз два три четеры9 Раз, два, три, четыре10 Раз, два, три, четыре, пять13 стоп два раза17 два, раз, ноль18 два, раз19 два, ноль, раз
По базовым параметрам службы полнотекстового поиска пока все.
P.S. Всё тестирование проводилось на SQL Server 2008
Вконтакте
Google+
sqlcom.ru
Полнотекстовый поиск MySQL
Задача полнотекстового поиска по таблицам базы данных, является неотъемлемой, практически, для каждого веб-ресурса. Все новички рано или поздно сталкиваются с вопросом, "как реализовать полнотекстовый поиск по сайту?" конечно сначала задача всплывает несколько иначе: "как сделать поиск по сайту?".
Отличие обычного поиска от полнотекстового в том что, при первом искать сущности сайта, будь то товары магазина или статьи блога, можно по конкретному параметру, например по дате добавления. Полнотекстовый поиск, в свою очередь, подразумевает поиск по совпадающим ключевым словам запроса и текста искомого товара или статьи.
Самым наглядным примером полнотекстового поиска являются поисковые системы, такие как yandex.ru или google.ru, при вводе запроса "Полнотекстовый поиск MySQL" в поисковую строку система разобьет фразу на три слова:
ПолнотекстовыйпоискMySQLЗатем проанализирует имеющиеся сущности, в данном случае это набор проиндексированных страниц сайтов, на наличие совпадений с каждым словом. Те страницы, которые имеют хотя бы одно из слов всей фразы либо их словоформ, будут выведены в поисковую выдачу.
Надо заметить, что поисковые системы обладают множеством алгоритмов позволяющих найти наиболее релевантную информацию по введенной фразе, но мы сегодня создадим самый простейший полнотекстовый поиск с помощью MySQL.
Как сделать полнотекстовый поиск MySQL
Какой бы не казалась задача полнотекстового поиска сложной, решается она очень быстро и просто. Беря в расчет, что сегодня большинство сайтов используют в качестве хранилища информации базу данных MySQL, то далее речь пойдет о реализации поиска по сайту именно по таблицам MySQL.
Реализовать поиск по таблицам MySQL можно разными способами:
Оператор LIKEОператор REGEXPОператоры AGAINST и MATCH
Первые два оператора самый примитивный вариант для поиска по сайту, и кроме того очень медлительный и требующий большой производительности сервера.
Поиск по сайту с помощью оператора LIKE
Например, реализовать поиск по таблице статей, используя оператор LIKE, можно следующим запросом:
SELECT * FROM `aticle` WHERE `content` LIKE “%новость%” Данный запрос выдаст все записи, т.е. все статьи в тексте которых встретится слово "новость", если в содержании самой статьи нет данного слова, но оно в присутствует в заголовке, статья не будет найдена.Чтобы искать статьи также и по совпадению в заголовках, можно усовершенствовать запрос:
SELECT * FROM `aticle` WHERE `content` LIKE “%новость%” OR `title` LIKE “%новость%” Этот SQL запрос учитывает два текстовых поля, по которым произойдет поиск статьи, но использует уже несколько операторов LIKE, а это двойная нагрузка на сервер. Кроме того если пользователь запросит статьи по фразе "новость дня", то получи те статьи, которые содержат исключительно именно такую фразу: "новость дня".MySql match – все что нужно для поиска по сайту
В арсенале программиста, использующего mysql, имеется стандартный инструмент для полнотекстового поиска MySql – операторы: MATCH и AGAINST.
Возьмем, к примеру, задачу поиска товаров по базе интернет магазина. Как правило, товар имеет ряд текстовых характеристик, таких как: название, описание, артикул, ключевые слова и др.
Используя для реализации полнотекстового поиска MATCH и AGAINST запрос может выглядит так:
SELECT * FROM `product` WHERE MATCH(`meta_desc`, `meta_keywords`) AGAINST('Full') При этом, для работоспособности запроса должен существовать индекс таблицы товаров с типом FULLTEXT, объединяющий в себе перечень полей для поиска:полнотекстовый-индекс-для-полнотекстового-поискаИмя индекса может быть любым, а в полях должны быть перечислены, все те, которые будут участвовать в поиске. При данном индексе, показанном на картинке, нельзя делать выборку только по одному из указанных полей.
WHERE MATCH(`meta_keywords`) – такой запрос выдаст ошибку и чтобы ее избежать нужно создать отдельный индекс и включить в него только одно поле (`meta_keywords`).
Для поиска части строки, а не строгого соответствия , нужно использовать модификатор INBOOLEANMODE и символ ‘*‘:
Искать не точное соответствие по введенной фразе и соответствие по ее частям можно таким образом:
SELECT * FROM `product` WHERE MATCH(`meta_desc`, `meta_keywords`) AGAINST('*ful**nam*' IN BOOLEAN MODE) При таком запросе в результат попадут записи имеющие вхождения фрагментов слов ful и namНадо учесть, что при работе с MATCH запрещено использовать в качестве именно полей зарезервированные слова.
Существует список запрещенных к использованию слов, то есть следующими словами нельзя называть поля таблиц, чтобы потом использовать их в полнотекстовом поиске MySql:
a’s able about above accordingaccordingly across actually after afterwardsagain against ain’t all allowallows almost alone along alreadyalso although always am amongamongst an and another anyanybody anyhow anyone anything anywayanyways anywhere apart appear appreciateappropriate are aren’t around asaside ask asking associated atavailable away awfully be becamebecause become becomes becoming beenbefore beforehand behind being believebelow beside besides best betterbetween beyond both brief butby c’mon c’s came cancan’t cannot cant cause causescertain certainly changes clearly cocom come comes concerning consequentlyconsider considering contain containing containscorresponding could couldn’t course currentlydefinitely described despite did didn’tdifferent do does doesn’t doingdon’t done down downwards duringeach edu eg eight eitherelse elsewhere enough entirely especiallyet etc even ever everyeverybody everyone everything everywhere exexactly example except far fewfifth first five followed followingfollows for former formerly forthfour from further furthermore getgets getting given gives gogoes going gone got gottengreetings had hadn’t happens hardlyhas hasn’t have haven’t havinghe he’s hello help henceher here here’s hereafter herebyherein hereupon hers herself hihim himself his hither hopefullyhow howbeit however i’d i’lli’m i’ve ie if ignoredimmediate in inasmuch inc indeedindicate indicated indicates inner insofarinstead into inward is isn’tit it’d it’ll it’s itsitself just keep keeps keptknow known knows last latelylater latter latterly least lesslest let let’s like likedlikely little look looking looksltd mainly many may maybeme mean meanwhile merely mightmore moreover most mostly muchmust my myself name namelynd near nearly necessary needneeds neither never nevertheless newnext nine no nobody nonnone noone nor normally notnothing novel now nowhere obviouslyof off often oh okokay old on once oneones only onto or otherothers otherwise ought our oursourselves out outside over overallown particular particularly per perhapsplaced please plus possible presumablyprobably provides que quite qvrather rd re really reasonablyregarding regardless regards relatively respectivelyright said same saw saysaying says second secondly seeseeing seem seemed seeming seemsseen self selves sensible sentserious seriously seven several shallshe should shouldn’t since sixso some somebody somehow someonesomething sometime sometimes somewhat somewheresoon sorry specified specify specifyingstill sub such sup suret’s take taken tell tendsth than thank thanks thanxthat that’s thats the theirtheirs them themselves then thencethere there’s thereafter thereby thereforetherein theres thereupon these theythey’d they’ll they’re they’ve thinkthird this thorough thoroughly thosethough three through throughout thruthus to together too tooktoward towards tried tries trulytry trying twice two ununder unfortunately unless unlikely untilunto up upon us useused useful uses using usuallyvalue various very via vizvs want wants was wasn’tway we we’d we’ll we’rewe’ve welcome well went wereweren’t what what’s whatever whenwhence whenever where where’s whereafterwhereas whereby wherein whereupon whereverwhether which while whither whowho’s whoever whole whom whosewhy will willing wish withwithin without won’t wonder wouldwouldn’t yes yet you you’dyou’ll you’re you’ve your yoursyourself yourselves zero Надо сказать, я потратил не один час на то чтобы понять, почему мой полнотекстовый поиск MySql то работает, то не очень, а ведь все дело оказалось именно в совпадении наименований полей с зарезервированными словами.Создание индекса для полей занятых в поиске.Выполнение sql запроса.Возникли вопросы? Пишите в комментариях! Подписывайтесь на RSS рассылку, впереди много интересных и полезных статей.
progerson.ru
Умный поиск в Wordpress. Плагин Search Unleashed
Нашел сегодня у Sonika статью по поводу поиска в WordPress. Понравился плагин Search Unleashed и я его русифицировал.
Описание можно посмотреть по ссылке выше, а у меня вы можете скачать модифициированную версию, адаптированную для русскоязычных пользователей.Из особенностей: после установки надо обязательно проиндексировать записи и комментарии — создается новая таблица в базе иначе искать вообще не будет ничего.
ОБНОВЛЕНО 2008-04-14: новая версия 0.2.16.
- С версии 0.2.12 не изменилось ничего, только исправили баги.
- Внес некоторые исправления: добавил определение Яндекс.Блоги и Google.Blogsearch, изменил структуру базы данных, т.к. в оригинальной версии при длинных реферерах или очень длинных поисковых запросах на странице блога выдавало ошибки превышения длины поля. Для тех кому интересно заменил в двух местах varchar(100) на longtext
- Изменил немного декодирование запросов через Яндекс (при обычном поиске там идет запрос в utf8, а в Яндекс.Блоги cp1251) чтобы определялись слова корректно
- Также заметил что если плагин ставится не в первый раз на блог, то при деактивации и повторной активации не создаются таблицы для поиска. Этот баг присутствует в версиях 0.2.8 и новее.
Исправляется баг в базе двумя способами:
- Установить версию 0.2.2 и после активации и индексации заменить ее новой версией
- Вручную в базе данных создать две таблицы через sql запрос в phpmyadmin
где ВАШПРЕФИКС_ нужно заменить например на префикс, который прописан у вас в конфигурации WordPress. Обычно это wp_
Также добавил идентификацию поиска через
- Mail.ru
- Aport
- Rambler
- Yahoo
- Webalta
- Google.Blogsearch (добавил в 0.2.11)
- Яндекс.Блоги (добавил в 0.2.11)
Скачать
Полная русская исправленная версия 0.2.16
Скачали 5341 раз
Ссылки на старые версии удаленыархив версии 0.2.2 (для решения проблемы с базой) для чего — см. вышеОфициальная страница плагина
Опубликовано 4 ноября 2007 в 22:44 Автор LecactusСвязанные записи
lecactus.ru