В этой статье мы обсуждаем различия между использованием SphinxSE и движка FEDERATED с Manticore Search
Плагин SphinxSE для MySQL был доступен с первого публичного релиза Sphinx Search. Идея заключалась в том, чтобы позволить пользователям выполнять поисковые запросы, используя так же подключение MySQL. Еще одним преимуществом было то, что результаты поиска можно было объединить с другой таблицей MySQL для дальнейшей фильтрации/сортировки или для отображения данных, недоступных в результате поиска. Также в то время SphinxQL еще не существовал.
Одна из проблем с SphinxSE заключается в том, что плагин не включен во все вариации MySQL. В настоящее время только MariaDB включает SphinxSE в свой список поставляемых плагинов. Тому, кто использует MySQL или вариант Percona, нужно будет скачать исходные коды MySQL и скомпилировать плагин SphinxSE, что не является готовым решением. Обновление MySQL до более новых версий может потребовать повторной компиляции для этой версии, что еще больше усложняло ситуацию. Поддержка SphinxSE также была болезненной с точки зрения разработки: это требовало постоянного обновления в соответствии с изменениями API MySQL и также, поскольку он имел собственный пользовательский синтаксис поиска, поддерживали еще один парсер запросов.
Добавление поддержки FEDERATED
Недавно мы добавили в Manticore Search поддержку запросов, выполняемых на таблице FEDERATED. Поскольку FEDERATED включен по умолчанию во всех вариациях MySQL, никакой специальной настройки или компиляции не требуется. Все, что вам нужно сделать , это создать таблицу FEDERATED, связующую с Manticore SphinxQL, и вы можете выполнять поисковые запросы.
SphinxSE требует отправки запроса в специальном формате, как набор параметров, разделенных точкой с запятой, таких как
WHERE query='test;filter=cat_id,1,5,10;groupby=day:published_ts;fieldweights=title,10,abstract,3,content,1;'
Этот синтаксис никогда не охватывал все функции, например возможность выполнять GROUP N BY.
В FEDERATED строка запроса – это полная команда SphinxQL SELECT:
WHERE query='SELECT * FROM test_index WHERE MATCH (\'test\') AND ANY(cat_id) IN (1,5,10 GROUP BY day,published_ts OPTION field_weights=(title=10,abstract=3,content=1)';
Кроме наличия всех функций поиска под рукой, запросы SphinxQL предлагают портативность, что упрощает их тестирование отдельно (с использованием клиента mysql).
Ограничения
Таблица FEDERATED, подключенная к Manticore, использует схему, аналогичную таблице SphinxSE: есть обязательный столбец для строки запроса. Чтобы получить значения атрибутов из результатов поиска, они должны иметь столбцы, объявленные в таблице.
Некоторые могут задаться вопросом, почему нельзя напрямую выполнить запрос SphinxQL вместо того, чтобы помещать его в строковый столбец. Главная проблема заключается в том, что SphinxQL имеет пользовательские фразы, такие как MATCH(), и парсер MySQL этого не распознает. Сам FEDERATED имеет некоторые недостатки, например, он игнорирует клаузулу LIMIT.
Другим ограничением является необходимость объединения с таблицей MySQL с целью выполнения дополнительной фильтрации или сортировки/группировки. Объединение происходит с набором результатов, предоставленным запросом поиска Manticore. Если вам нужно, например, выполнить сортировку, включающую столбец из таблицы MySQL, который должен применяться ко всему поиску, весь набор результатов должен быть получен от Manticore. Это может стать проблемой при больших объемах результатов. Возможно, будет лучше добавить необходимые столбцы в Manticore и выполнить желаемую операцию в Manticore.
Индекс Manticore, используемый в определении таблицы FEDERATED, должен быть индексом со хранилищем (обычным или RealTime).
Подсветка текста
С помощью FEDERATED возможно выполнять извлечение фрагментов текста, который хранится только в MySQL. Настройка требует вторичной таблицы FEDERATED, которая будет использоваться для выполнения SELECT с функцией SNIPPET. Рассмотрим пример с использованием статей из Википедии, где мы хотим получить только ID статьи и заголовок (который не хранится в нашем индексе):
Сначала мы объявляем таблицу FEDERATED, где WikiSearch
будет использоваться для выполнения фактического поиска, а WikiSnippet
для SELECT с извлечением фрагментов:
CREATE TABLE WikiSearch
(
id INTEGER UNSIGNED NOT NULL,
query VARCHAR(1024) NOT NULL,
INDEX(query)
) ENGINE=FEDERATED
DEFAULT CHARSET=utf8
CONNECTION='mysql://[email protected]:9306/DB/wikipedia';
CREATE TABLE WikiSnippet
(
id INTEGER UNSIGNED NOT NULL,
snippets VARCHAR(1024) NOT NULL,
query VARCHAR(1024) NOT NULL,
INDEX(query)
) ENGINE=FEDERATED
DEFAULT CHARSET=utf8
CONNECTION='mysql://[email protected]:9306/DB/wikipedia';
Мы собираемся выполнить поиск по индексу Википедии из Manticore и объединить результат с таблицей Википедии (названной wikipediaTable
) из MySQL. id
и article
из объединенного запроса будут использоваться для выполнения индивидуального SELECT для каждой статьи, который вернет фрагмент.
mysql> SELECT id,
(SELECT snippets FROM WikiSnippet WHERE query=concat('SELECT SNIPPET(\'',a.title,'\',\'town\') AS snippets FROM wikipedia WHERE id=',a.id)) AS snippet
FROM ( SELECT WikiSearch.id,wikipediaTable.title FROM WikiSearch JOIN wikipediaTable ON WikiSearch.id=content.id WHERE
query='SELECT id FROM wikipedia WHERE match(\'@title town\')') a;
+-----------+----------------------------------------------------------+
| id | snippet |
+-----------+----------------------------------------------------------+
| 221741590 | Новая Англия <b>город</b> |
| 225879601 | <b>Город</b>ские собрания |
| 227372942 | Хаддерсфилд <b>Тауна</b> Ф. К. |
| 227789260 | Кейп <b>Таун</b> |
| 228005065 | Линкольн <b>Город</b> Кар |
| 228031371 | Свиндон <b>Таун</b> Ф.К. |
| 228037958 | Ньюберг (<b>таун</b>), Нью-Йорк |
| 209273335 | Льюистон (<b>таун</b>), Нью-Йорк |
| 218353936 | Список пригородов Кейп <b>Таун</b> |
| 218900544 | Новый <b>Таун</b>, Прага |
| 219113587 | История Свиндона <b>Таун</b> Ф.К. |
| 221331452 | Крайслер <b>Таун</b> и Кантри |
| 222331137 | Список статистики и рекордов Ipswich <b>Таун</b> Ф.К. |
| 225807671 | Ист-Хэмптон (<b>таун</b>), Нью-Йорк |
| 226345846 | Старый <b>Таун</b> |
| 226474919 | Сенгканг Новый <b>Таун</b> |
| 227031418 | Кэмден <b>Таун</b> |
| 227043533 | Список <b>таун</b> трамвайных систем в Соединенных Штатах |
| 227328024 | Призрак <b>таун</b> |
| 227337559 | <b>Таун</b> |
+-----------+----------------------------------------------------------+
20 строк в наборе (0.01 сек)
Для получения дополнительной информации, загляните на страницу поддержки FEDERATED в официальной документации.