Spec-Zone .ru
спецификации, руководства, описания, API

23.2.4.4. Запись Полнотекстовых Плагинов Синтаксического анализатора

Полнотекстовый плагин сервера синтаксического анализатора может использоваться, чтобы заменить или изменить встроенный полнотекстовый синтаксический анализатор. Этот раздел описывает, как записать полнотекстовый названный плагин синтаксического анализатора simple_parser. Этот плагин выполняет парсинг, основанный на более простых правилах чем используемые MySQL встроенный полнотекстовый синтаксический анализатор: Слова являются непустыми выполнениями пробельных символов.

Инструкции используют исходный код в plugin/fulltext каталог исходных дистрибутивов MySQL, так изменяют расположение в тот каталог. Следующая процедура описывает, как сменная библиотека создается:

  1. Чтобы записать полнотекстовый плагин синтаксического анализатора, включайте следующий заголовочный файл в сменный исходный файл. Другой MySQL или общие заголовочные файлы могли бы также быть необходимы.

    #include <mysql/plugin.h>

    plugin.h определяет MYSQL_FTPARSER_PLUGIN тип плагина сервера и структуры данных должны были объявить плагин.

  2. Установите дескриптор библиотеки для сменного файла библиотеки.

    Этот дескриптор содержит общий сменный дескриптор для плагина сервера. Для полнотекстового плагина синтаксического анализатора тип должен быть MYSQL_FTPARSER_PLUGIN. Это - значение, которое идентифицирует плагин, как являющийся законным для использования в a WITH PARSER пункт, создавая a FULLTEXT индексировать. (Никакой другой сменный тип не является законным для этого пункта.)

    Например, дескриптор библиотеки для библиотеки, которая содержит единственный полнотекстовый названный плагин синтаксического анализатора simple_parser похож на это:

    mysql_declare_plugin(ftexample){  MYSQL_FTPARSER_PLUGIN,      /* type                            */  &simple_parser_descriptor,  /* descriptor                      */  "simple_parser",            /* name                            */  "Oracle Corporation",       /* author                          */  "Simple Full-Text Parser",  /* description                     */  PLUGIN_LICENSE_GPL,         /* plugin license                  */  simple_parser_plugin_init,  /* init function (when loaded)     */  simple_parser_plugin_deinit,/* deinit function (when unloaded) */  0x0001,                     /* version                         */  simple_status,              /* status variables                */  simple_system_variables,    /* system variables                */  NULL,  0}mysql_declare_plugin_end;

    name элемент (simple_parser) указывает на имя, чтобы использовать для ссылок на плагин в операторах такой как INSTALL PLUGIN или UNINSTALL PLUGIN. Это - также имя, выведенное на экран SHOW PLUGINS или INFORMATION_SCHEMA.PLUGINS.

    Для получения дополнительной информации см. Раздел 23.2.4.2.1, "Библиотека Плагина сервера и Сменные Дескрипторы".

  3. Установите специфичный для типа сменный дескриптор.

    Каждый общий сменный дескриптор в дескрипторе библиотеки указывает на специфичный для типа дескриптор. Для полнотекстового плагина синтаксического анализатора специфичный для типа дескриптор является экземпляром st_mysql_ftparser структура в plugin.h файл:

    struct st_mysql_ftparser{  int interface_version;  int (*parse)(MYSQL_FTPARSER_PARAM *param);  int (*init)(MYSQL_FTPARSER_PARAM *param);  int (*deinit)(MYSQL_FTPARSER_PARAM *param);};

    Как показано по определению структуры, дескриптор имеет номер версии интерфейса и содержит указатели на три функции. Версия определяется, используя символ формы MYSQL_xxx_INTERFACE_VERSION (такой как (MYSQL_FTPARSER_INTERFACE_VERSION для полнотекстовых плагинов синтаксического анализатора) init и deinit элементы должны указать на функцию или быть установлены в 0, если функция не необходима. parse элемент должен указать на функцию, которая выполняет парсинг.

    В simple_parser объявление, тот дескриптор обозначается &simple_parser_descriptor. Дескриптор определяет номер версии для полнотекстового сменного интерфейса (как дано MYSQL_FTPARSER_INTERFACE_VERSION), и парсинг плагина, инициализация, и функции deinitialization:

    static struct st_mysql_ftparser simple_parser_descriptor={  MYSQL_FTPARSER_INTERFACE_VERSION, /* interface version      */  simple_parser_parse,              /* parsing function       */  simple_parser_init,               /* parser init function   */  simple_parser_deinit              /* parser deinit function */};

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

    • Для того, чтобы индексировать, сервер вызывает синтаксический анализатор для каждого значения столбца, которое будет индексировано.

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

    Сменное объявление в общем сменном дескрипторе имеет init и deinit элементы, которые указывают на инициализацию и функции deinitialization, и так делают специфичный для типа сменный дескриптор, к который это указывает. Однако, эти пары функций имеют различные цели и вызываются по различным причинам:

    • Для сменного объявления в общем сменном дескрипторе вызываются инициализация и функции deinitialization, когда плагин загружается и разгружается.

    • Для специфичного для типа сменного дескриптора инициализация и функции deinitialization вызываются на SQL-оператор, для которого используется плагин.

    Каждая функция интерфейса, названная в сменном дескрипторе, должна возвратить нуль для успеха или ненулевой для отказа, и каждый из них получает параметр, который указывает на a MYSQL_FTPARSER_PARAM структура, содержащая контекст парсинга. У структуры есть это определение:

    typedef struct st_mysql_ftparser_param{  int (*mysql_parse)(struct st_mysql_ftparser_param *,                     char *doc, int doc_len);  int (*mysql_add_word)(struct st_mysql_ftparser_param *,                        char *word, int word_len,                        MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info);  void *ftparser_state;  void *mysql_ftparam;  struct charset_info_st *cs;  char *doc;  int length;  int flags;  enum enum_ftparser_mode mode;} MYSQL_FTPARSER_PARAM;

    Элементы структуры используются следующим образом:

    • mysql_parse: Указатель на функцию обратного вызова, которая вызывает встроенный синтаксический анализатор сервера. Используйте этот обратный вызов, когда плагин действует как фронтэнд к встроенному синтаксическому анализатору. Таким образом, когда функция парсинга плагина вызывается, она должна обработать ввод, чтобы извлечь текст и передать текст к mysql_parse обратный вызов.

      Первый параметр для этой функции обратного вызова должен быть param цените себя:

      param->mysql_parse(param, ...);

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

    • mysql_add_word: Указатель на функцию обратного вызова, которая добавляет слово к полнотекстовому, индексирует или к списку критериев поиска. Используйте этот обратный вызов, когда плагин синтаксического анализатора заменяет встроенный синтаксический анализатор. Таким образом, когда функция парсинга плагина вызывается, она должна проанализировать ввод в слова и вызвать mysql_add_word обратный вызов для каждого слова.

      Первый параметр для этой функции обратного вызова должен быть param цените себя:

      param->mysql_add_word(param, ...);
    • ftparser_state: Это - универсальный указатель. Плагин может установить это, чтобы указать на информацию, которая будет использоваться внутренне в ее собственных целях.

    • mysql_ftparam: Это устанавливается сервером. Это передают как первый параметр mysql_parse или mysql_add_word обратный вызов.

    • cs: Указатель на информацию о наборе символов текста, или 0, если никакая информация не доступна.

    • doc: Указатель на текст, который будет проанализирован.

    • length: Длина текста, который будет проанализирован, в байтах.

    • flags: Флаги синтаксического анализатора. Это - нуль, если нет никаких специальных флагов. В настоящий момент единственный ненулевой флаг MYSQL_FTFLAGS_NEED_COPY, что означает это mysql_add_word() должен сохранить копию слова (то есть, оно не может использовать указатель на слово, потому что слово находится в буфере, который будет перезаписан.) Этот элемент был добавлен в MySQL 5.1.12.

      Этот флаг мог бы быть установлен или сброшен MySQL прежде, чем вызвать плагин синтаксического анализатора плагином синтаксического анализатора непосредственно, или mysql_parse() функция.

    • mode: Режим парсинга. Это значение будет одной из следующих констант:

      • MYSQL_FTPARSER_SIMPLE_MODE: Синтаксический анализ в быстром и простом режиме, который используется для того, чтобы индексировать и для запросов естественного языка. Синтаксический анализатор должен передать к серверу только те слова, которые должны быть индексированы. Если синтаксический анализатор использует пределы длины или список stopword, чтобы определить, какие слова проигнорировать, он не должен передать такие слова к серверу.

      • MYSQL_FTPARSER_WITH_STOPWORDS: Синтаксический анализ в stopword режиме. Это используется в булевых поисках соответствия фразы. Синтаксический анализатор должен передать все слова к серверу, даже stopwords или слова, которые являются вне любых нормальных пределов длины.

      • MYSQL_FTPARSER_FULL_BOOLEAN_INFO: Синтаксический анализ в булевом режиме. Это используется для того, чтобы проанализировать булевы строки запроса. Синтаксический анализатор должен распознать не только слова, но также и операторы булева режима и передать их к серверу как маркеры, используя mysql_add_word обратный вызов. Чтобы сказать сервер, какой маркер передают, плагин должен заполнить a MYSQL_FTPARSER_BOOLEAN_INFO структура и передача указатель на это.

    Если синтаксический анализатор вызывают в булевом режиме, param->mode значение будет MYSQL_FTPARSER_FULL_BOOLEAN_INFO. MYSQL_FTPARSER_BOOLEAN_INFO структура, что использование синтаксического анализатора для того, чтобы передать информацию о маркере к серверу похоже на это:

    typedef struct st_mysql_ftparser_boolean_info{  enum enum_ft_token_type type;  int yesno;  int weight_adjust;  bool wasign;  bool trunc;  /* These are parser state and must be removed. */  byte prev;  byte *quot;} MYSQL_FTPARSER_BOOLEAN_INFO;

    Синтаксический анализатор должен заполнить элементы структуры следующим образом:

    • type: Тип маркера. Следующая таблица показывает допустимые типы.

      Таблица 23.3. Полнотекстовые Типы маркера Синтаксического анализатора

      Символическая стоимость Значение
      FT_TOKEN_EOF Конец данных
      FT_TOKEN_WORD Регулярное слово
      FT_TOKEN_LEFT_PAREN Начало группы или подвыражения
      FT_TOKEN_RIGHT_PAREN Конец группы или подвыражения
      FT_TOKEN_STOPWORD stopword

    • yesno: Должно ли слово присутствовать для соответствия, чтобы произойти. 0 средств, что слово является дополнительным, но увеличивает уместность соответствия, если это присутствует. Значения, больше чем 0 средних значений, что слово должно присутствовать. Значения, меньшие чем 0 средних значений, что слово не должно присутствовать.

    • weight_adjust: Фактор взвешивания, который определяет сколько достойный подсчетов слов. Это может использоваться, чтобы увеличить или уменьшить важность слова в вычислениях уместности. Значение нуля не указывает ни на какую корректировку веса. Значения, больше чем или меньше чем нулевое среднее значение выше или более низкий вес, соответственно. Примеры в Разделе 12.9.2, "Булевы Полнотекстовые Поискы", то использование < и > операторы иллюстрируют, как взвешивание работает.

    • wasign: Знак фактора взвешивания. Отрицательная величина действует как ~ булев оператор поиска, который заставляет содействие слова уместности быть отрицательным.

    • trunc: Должно ли соответствие быть сделано как будто булев режим * оператору усечения дали.

    Плагины не должны использовать prev и quot элементы MYSQL_FTPARSER_BOOLEAN_INFO структура.

  4. Установите сменные функции интерфейса.

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

    static int simple_parser_plugin_init(void *arg __attribute__((unused))){  return(0);}static int simple_parser_plugin_deinit(void *arg __attribute__((unused))){  return(0);}

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

    Специфичный для типа сменный дескриптор для simple_parser называет инициализацию, deinitialization, и анализирующие функции, которые вызывает сервер, когда плагин используется. Для simple_parser, инициализация и функции deinitialization ничего не делают:

    static int simple_parser_init(MYSQL_FTPARSER_PARAM *param                              __attribute__((unused))){  return(0);}static int simple_parser_deinit(MYSQL_FTPARSER_PARAM *param                                __attribute__((unused))){  return(0);}

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

    Основная функция парсинга, simple_parser_parse(), действия как замена для встроенного полнотекстового синтаксического анализатора, таким образом, это должно разделить текст на слова и передать каждое слово к серверу. Первым параметром функции парсинга является указатель на структуру, которая содержит контекст парсинга. У этой структуры есть a doc элемент, который указывает на текст, который будет проанализирован, и a length элемент, который указывает, какой длины текст. Простой парсинг, сделанный плагином, полагает, что непустые выполнения пробельных символов слова, таким образом, это идентифицирует слова как это:

    static int simple_parser_parse(MYSQL_FTPARSER_PARAM *param){  char *end, *start, *docend= param->doc + param->length;  for (end= start= param->doc;; end++)  {    if (end == docend)    {      if (end > start)        add_word(param, start, end - start);      break;    }    else if (isspace(*end))    {      if (end > start)        add_word(param, start, end - start);      start= end + 1;    }  }  return(0);}

    Поскольку синтаксический анализатор находит каждое слово, он вызывает функцию add_word() передать слово к серверу. add_word() функция помощника только; это не часть сменного интерфейса. Синтаксический анализатор передает указатель контекста парсинга на add_word(), так же как указатель на слово и значение длины:

    static void add_word(MYSQL_FTPARSER_PARAM *param, char *word, size_t len){  MYSQL_FTPARSER_BOOLEAN_INFO bool_info=    { FT_TOKEN_WORD, 0, 0, 0, 0, ' ', 0 };  param->mysql_add_word(param, word, len, &bool_info);}

    Для парсинга булева режима, add_word() заполняет элементы bool_info структура как описано ранее в обсуждении st_mysql_ftparser_boolean_info структура.

  5. Установите переменные состояния. Для simple_parser плагин, следующий массив переменной состояния устанавливает одну переменную состояния со значением, которое является статическим текстом, и другим со значением, которое сохранено в переменной длинного целого:

    long number_of_calls= 0;struct st_mysql_show_var simple_status[]={  {"static", (char *)"just a static text", SHOW_CHAR},  {"called", (char *)&number_of_calls,     SHOW_LONG},  {0,0,0}};

    Когда плагин устанавливается, сменное имя и name к значению присоединяются с подчеркиванием, чтобы сформировать имя, выведенное на экран SHOW STATUS. Для массива, только показанного, получающиеся имена переменной состояния simple_parser_static и simple_parser_called. Это соглашение означает, что можно легко вывести на экран переменные для плагина, используя его имя:

    mysql> SHOW STATUS LIKE
                        'simple_parser%';+----------------------+--------------------+| Variable_name        | Value              |+----------------------+--------------------+| simple_parser_static | just a static text || simple_parser_called | 0                  |+----------------------+--------------------+
  6. Чтобы скомпилировать и установить сменный объектный файл библиотеки, используйте инструкции в Разделе 23.2.4.3, "Компилируя и Устанавливая Сменные Библиотеки". Чтобы использовать файл библиотеки, это должно быть установлено в сменном каталоге (каталог, названный plugin_dir системная переменная). Для simple_parser плагин, это компилируется и устанавливается, когда Вы создаете MySQL из источника. Это также включается в двоичные дистрибутивы. Процесс сборки производит совместно используемую библиотеку объектов с именем mypluglib.so (суффикс мог бы отличаться в зависимости от Вашей платформы).

  7. Чтобы использовать плагин, зарегистрируйте это в сервере. Например, чтобы зарегистрировать плагин во времени выполнения, используйте этот оператор (изменяющий суффикс по мере необходимости):

    mysql> INSTALL PLUGIN simple_parser
                        SONAME 'mypluglib.so';

    Для дополнительной информации о сменной загрузке см. Раздел 5.1.8.1, "Устанавливая и Удаляя Плагины".

  8. Чтобы проверить сменную установку, исследуйте INFORMATION_SCHEMA.PLUGINS таблица или использование SHOW PLUGINS оператор.

  9. Протестируйте плагин, чтобы проверить, что он работает должным образом.

    Составьте таблицу, которая содержит строковый столбец, и свяжите плагин синтаксического анализатора с a FULLTEXT индексируйте на столбце:

    mysql> CREATE TABLE t (c
                        VARCHAR(255),    ->  FULLTEXT (c) WITH PARSER
                        simple_parser    -> )
                        ENGINE=MyISAM;Query OK, 0 rows affected (0.01 sec)

    Вставьте некоторый текст в таблицу и попробуйте некоторые поискы. Они должны проверить, что плагин синтаксического анализатора обрабатывает все непробельные символы как символы слова:

    mysql> INSERT INTO t
                        VALUES    ->  ('latin1_general_cs is a
                        case-sensitive collation'),    ->  ('I\'d like a
                        case of oranges'),    ->  ('this is sensitive
                        information'),    ->  ('another
                        row'),    ->  ('yet another
                        row');Query OK, 5 rows affected (0.02 sec)Records: 5  Duplicates: 0  Warnings: 0mysql> SELECT c FROM t;+-------------------------------------------------+| c                                               |+-------------------------------------------------+| latin1_general_cs is a case-sensitive collation || I'd like a case of oranges                      || this is sensitive information                   || another row                                     || yet another row                                 |+-------------------------------------------------+5 rows in set (0.00 sec)mysql> SELECT MATCH(c) AGAINST('case') FROM t;+--------------------------+| MATCH(c) AGAINST('case') |+--------------------------+|                        0 ||          1.2968142032623 ||                        0 ||                        0 ||                        0 |+--------------------------+5 rows in set (0.00 sec)mysql> SELECT MATCH(c) AGAINST('sensitive') FROM t;+-------------------------------+| MATCH(c) AGAINST('sensitive') |+-------------------------------+|                             0 ||                             0 ||               1.3253291845322 ||                             0 ||                             0 |+-------------------------------+5 rows in set (0.01 sec)mysql> SELECT MATCH(c) AGAINST('case-sensitive') FROM t;+------------------------------------+| MATCH(c) AGAINST('case-sensitive') |+------------------------------------+|                    1.3109166622162 ||                                  0 ||                                  0 ||                                  0 ||                                  0 |+------------------------------------+5 rows in set (0.01 sec)mysql> SELECT MATCH(c) AGAINST('I\'d') FROM t;+--------------------------+| MATCH(c) AGAINST('I\'d') |+--------------------------+|                        0 ||          1.2968142032623 ||                        0 ||                        0 ||                        0 |+--------------------------+5 rows in set (0.01 sec)

    Отметьте, как ни "случай", ни "нечувствительное" соответствие, "нечувствительное к регистру" способ, которым они были бы для встроенного синтаксического анализатора.