О SphinxSE
Движок хранения Sphinx (SphinxSE) — это движок хранения, который взаимодействует с searchd (демон Sphinx), чтобы обеспечить возможность поиска по тексту. Sphinx и SphinxSE используются в качестве более быстрого и настраиваемого альтернативного решения по сравнению со встроенным полным поиском MariaDB полного текста.
Sphinx не зависит от MariaDB и может работать автономно, но SphinxSE предоставляет удобный интерфейс к базовому демону Sphinx.
Версии SphinxSE в MariaDB
| Версия SphinxSE | Введена | Статус |
|---|---|---|
| SphinxSE 2.2.6 | MariaDB 10.0.15 | Стабильная |
| SphinxSE 2.1.9 | MariaDB 10.0.14 | Стабильная |
| SphinxSE 2.0.4 | MariaDB 5.5 | |
| SphinxSE 0.99 | MariaDB 5.2 и MariaDB 5.3 |
Включение SphinxSE в MariaDB
Движок хранения Sphinx включён в исходные коды, двоичные файлы и пакеты MariaDB. SphinxSE построен как динамически загружаемый плагин .so. Для его использования необходимо выполнить однократную установку:
INSTALL SONAME 'ha_sphinx';
В пакетах Debian/Ubuntu SphinxSE статически скомпилирован в сервер MariaDB, нет необходимости использовать оператор INSTALL SONAME.
После установки SphinxSE появится в списке установленных движков хранения:
SHOW ENGINES; +------------+---------+--------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +------------+---------+--------------------------------------------+--------------+------+------------+ ... | SPHINX | YES | Sphinx storage engine 0.9.9 | NO | NO | NO | ... +------------+---------+--------------------------------------------+--------------+------+------------+
Этот шаг выполняется один раз и больше повторять не нужно.
Примечание: SphinxSE — это только часть движка хранения Sphinx. Вам необходимо установить сам Sphinx, чтобы использовать SphinxSE в MariaDB.
Несмотря на название, SphinxSE фактически не хранит данные. Он представляет собой встроенный клиент, который позволяет MariaDB взаимодействовать с Sphinx, выполнять запросы поиска и получать результаты поиска. Все индексирование и поиск происходят за пределами MariaDB.
Некоторые применения SphinxSE включают:
- более лёгкую миграцию приложений MariaDB/MySQL FTS в Sphinx
- позволяет использовать Sphinx с языками программирования, для которых ещё нет доступных родных API
- оптимизации, когда требуется дополнительная обработка набора результатов Sphinx на стороне MariaDB (например, объединения с исходными таблицами документов, дополнительная фильтрация на стороне MariaDB и т. д.)
Использование SphinxSE
Основные принципы использования
Для поиска с помощью SphinxSE необходимо создать специальную ENGINE=SPHINX «таблицу поиска», а затем SELECT из неё с запросом по полному тексту, помещённым в WHERE запрос для столбца.
Вот пример оператора создания и запроса поиска:
CREATE TABLE t1
(
id BIGINT UNSIGNED NOT NULL,
weight INTEGER NOT NULL,
query VARCHAR(3072) NOT NULL,
group_id INTEGER,
INDEX(query)
) ENGINE=SPHINX CONNECTION="sphinx://127.0.0.1:9312/test1";
SELECT * FROM t1 WHERE query='test it;mode=any';
Первые три столбца таблицы поиска должны иметь тип BIGINT для первого столбца (идентификатор документа), INTEGER или BIGINT для второго столбца (вес совпадения) и VARCHAR или TEXT для третьего столбца (ваш запрос) соответственно. Эта схема фиксированная; вы не можете опустить ни один из этих трёх необходимых столбцов, изменить их порядок или типы. Кроме того, столбец запроса должен быть индексирован; все остальные должны оставаться без индексов. Имена столбцов игнорируются, поэтому вы можете использовать произвольные.
Дополнительные столбцы должны быть либо INTEGER, TIMESTAMP, BIGINT, VARCHAR, или FLOAT. Они будут связаны с атрибутами, предоставленными в наборе результатов Sphinx по имени, поэтому их имена должны соответствовать именам атрибутов, указанным в sphinx.conf. Если такого имени атрибута в результатах поиска Sphinx нет, дополнительные столбцы будут иметь значения NULL.
Специальные «виртуальные» имена атрибутов также могут быть связаны со столбцами SphinxSE. _sph_ нужно использовать вместо @ для этого. Например, чтобы получить значения виртуальных атрибутов '@groupby', '@count', или '@distinct', используйте имена столбцов '_sph_groupby', '_sph_count' или '_sph_distinct' соответственно.
Параметр строки CONNECTION используется для указания хоста, порта и индексов по умолчанию для запросов, выполняемых с помощью этой таблицы. Если строка подключения не указана в CREATE
TABLE, предполагаются имя индекса '*' (т. е. поиск по всем индексам) и '127.0.0.1:9312'. Синтаксис строки подключения следующий:
CONNECTION="sphinx://HOST:PORT/INDEXNAME"
Вы можете изменить строку подключения по умолчанию позже так:
ALTER TABLE t1 CONNECTION="sphinx://NEWHOST:NEWPORT/NEWINDEXNAME";
Вы также можете переопределить все эти параметры для каждого запроса.
Примечание: Для использования сокетов Linux вы можете изменить раздел searchd файла конфигурации Sphinx, установив параметр listen на имя файла сокета. Укажите SphinxSE сокет с помощью CONNECTION="unix:unix/domain/socket[:index]".
Параметры поиска
Как видно из примера выше, как текст запроса, так и параметры поиска должны быть помещены в WHERE выражение запроса поиска (т. е. в третий столбец); параметры разделяются точкой с запятой (';'), а имена отделяются от значений знаком равенства ('='). Можно указать любое количество параметров. Доступные параметры:
- query - текст запроса;
- mode - режим сопоставления. Должно быть одним из «all», «any», «phrase», «boolean» или «extended». По умолчанию — «all»;
- sort - режим сортировки совпадений. Должно быть одним из «relevance», «attr_desc», «attr_asc», «time_segments» или «extended». Во всех режимах, кроме «relevance», имя атрибута (или предложение сортировки для «extended») также требуется после двоеточия:
... WHERE query='test;sort=attr_asc:group_id'; ... WHERE query='test;sort=extended:@weight desc, group_id asc';
- offset - смещение в наборе результатов, по умолчанию 0;
- limit - количество совпадений для извлечения из набора результатов, по умолчанию 20;
- index - имена индексов для поиска:
... WHERE query='test;index=test1;'; ... WHERE query='test;index=test1,test2,test3;';
- minid, maxid - минимальный и максимальный идентификатор документа для сопоставления;
- weights - список весов, разделяемых запятыми, которые необходимо назначить полям Sphinx с полным текстом:
... WHERE query='test;weights=1,2,3;';
- filter, !filter - имя атрибута, разделённое запятыми, и набор значений для соответствия:
# only include groups 1, 5 and 19 ... WHERE query='test;filter=group_id,1,5,19;'; # exclude groups 3 and 11 ... WHERE query='test;!filter=group_id,3,11;';
- range, !range - имя атрибута, разделённое запятыми, минимальное и максимальное значение для соответствия:
# include groups from 3 to 7, inclusive ... WHERE query='test;range=group_id,3,7;'; # exclude groups from 5 to 25 ... WHERE query='test;!range=group_id,5,25;';
- maxmatches - максимальное значение совпадений на запрос:
... WHERE query='test;maxmatches=2000;';
- groupby - функция и атрибут группировки:
... WHERE query='test;groupby=day:published_ts;'; ... WHERE query='test;groupby=attr:group_id;';
- groupsort - предложение сортировки по группировке:
... WHERE query='test;groupsort=@count desc;';
- indexweights - список имён индексов и весов, разделяемых запятыми, используемых при поиске в нескольких индексах:
... WHERE query='test;indexweights=idx_exact,2,idx_stemmed,1;';
- comment - строка для маркировки этого запроса в журнале запросов (соответствует параметру $comment в вызове API Query()):
... WHERE query='test;comment=marker001;';
- select - строка с выражениями для вычисления (соответствует вызову API SetSelect()):
... WHERE query='test;select=2*a+3*b as myexpr;';
Примечание: Гораздо эффективнее позволить Sphinx выполнять сортировку, фильтрацию и выборку набора результатов, чем увеличивать максимальное количество совпадений и использовать WHERE, ORDER BY, и LIMIT предложения на стороне MariaDB. Это обусловлено двумя причинами:
- Sphinx выполняет ряд оптимизаций и работает лучше, чем MariaDB/MySQL, в этих задачах.
- Меньше данных необходимо будет упаковывать
searchd, передавать и распаковывать SphinxSE.
SHOW ENGINE SPHINX STATUS
Начиная с версии 0.9.9-rc1, дополнительная информация о запросе помимо набора результатов может быть получена с помощью оператора 'SHOW ENGINE SPHINX STATUS':
SHOW ENGINE SPHINX STATUS; +--------+-------+-------------------------------------------------+ | Type | Name | Status | +--------+-------+-------------------------------------------------+ | SPHINX | stats | total: 25, total found: 25, time: 126, words: 2 | | SPHINX | words | sphinx:591:1256 soft:11076:15945 | +--------+-------+-------------------------------------------------+
Эта информация также доступна через переменные состояния. Обратите внимание, что для этого метода не требуется привилегии суперпользователя.
SHOW STATUS LIKE 'sphinx_%'; +--------------------+----------------------------------+ | Variable_name | Value | +--------------------+----------------------------------+ | sphinx_total | 25 | | sphinx_total_found | 25 | | sphinx_time | 126 | | sphinx_word_count | 2 | | sphinx_words | sphinx:591:1256 soft:11076:15945 | +--------------------+----------------------------------+
Объединения с SphinxSE
Вы можете выполнять JOIN между таблицей поиска SphinxSE и таблицами, использующими другие движки. Вот пример с «documents» из example.sql:
SELECT content, date_added FROM test.documents docs
JOIN t1 ON (docs.id=t1.id)
WHERE query="one document;mode=any";
+-------------------------------------+---------------------+
| content | docdate |
+-------------------------------------+---------------------+
| this is my test document number two | 2006-06-17 14:04:28 |
| this is my test document number one | 2006-06-17 14:04:28 |
+-------------------------------------+---------------------+
SHOW ENGINE SPHINX STATUS;
+--------+-------+---------------------------------------------+
| Type | Name | Status |
+--------+-------+---------------------------------------------+
| SPHINX | stats | total: 2, total found: 2, time: 0, words: 2 |
| SPHINX | words | one:1:2 document:2:2 |
+--------+-------+---------------------------------------------+
Создание фрагментов (выдержек) через MariaDB
Начиная с версии 0.9.9-rc2, SphinxSE также включает функцию UDF, которая позволяет создавать фрагменты через MariaDB. Функциональность полностью аналогична вызову API BuildExcerprts, но доступна через MariaDB+SphinxSE.
Двоичный файл, предоставляющий UDF, называется sphinx.so и автоматически создаётся и устанавливается в соответствующее место вместе с самим SphinxSE. Регистрируйте UDF с помощью следующего оператора:
CREATE FUNCTION sphinx_snippets RETURNS STRING SONAME 'sphinx.so';
UDF упакован вместе с движком хранения в одном двоичном файле под названием ha_sphinx.so. Регистрируйте UDF с помощью следующего оператора:
CREATE FUNCTION sphinx_snippets RETURNS STRING SONAME 'ha_sphinx.so';
Имя функции должно быть 'sphinx_snippets', вы не можете использовать произвольное имя. Аргументы функции следующие:
Prototype: function sphinx_snippets ( document, index, words, [options] );
Аргументы document и words могут быть строками или столбцами таблиц. Параметры должны быть указаны следующим образом: <code>'значение' AS имя_параметра</code>. Список поддерживаемых параметров см. в вызове API BuildExcerprts(). Единственный дополнительный параметр UDF называется «sphinx» и позволяет указать расположение searchd (хост и порт).
Примеры использования:
SELECT sphinx_snippets('hello world doc', 'main', 'world',
'sphinx://192.168.1.1/' AS sphinx, true AS exact_phrase,
'[b]' AS before_match, '[/b]' AS after_match)
FROM documents;
SELECT title, sphinx_snippets(text, 'index', 'mysql php') AS text
FROM sphinx, documents
WHERE query='mysql php' AND sphinx.id=documents.id;
Дополнительная информация
Дополнительную информацию о Sphinx и SphinxSE можно найти на сайте Sphinx.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/about-sphinxse/