Spec-Zone.ru › MariaDB

О 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';
MariaDB до 10.0

В пакетах 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. Это обусловлено двумя причинами:

  1. Sphinx выполняет ряд оптимизаций и работает лучше, чем MariaDB/MySQL, в этих задачах.
  2. Меньше данных необходимо будет упаковывать 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.

MariaDB до 5.5

Двоичный файл, предоставляющий UDF, называется sphinx.so и автоматически создаётся и устанавливается в соответствующее место вместе с самим SphinxSE. Регистрируйте UDF с помощью следующего оператора:

CREATE FUNCTION sphinx_snippets RETURNS STRING SONAME 'sphinx.so';
MariaDB до 10.0

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.

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

© 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API