Интернет, компьютеры, софт и прочий Hi-Tech | |||||||
Избранные докиМетки (все метки)hi tech, internet, it, интернет, информационные технологии, ит, по, программное обеспечение, сайт, софт
Подписаться через RSS2Email.ru
Дополнительнооптимизация, сайт, мониторы, движок, Битрикс, хостинг, сайты, мобильные, электроника, видеокарта |
SQLite: расширения FTS3 и FTS4
Содержание
5. ТокенайзерыТокенайзер FTS — это набор правил для извлечения термов из документа или простого полнотекстового запроса FTS. Если при создании таблицы FTS в запросе
Пусть, например, документ содержит текст "Right now, they're very frustrated". Тогда из этого документа будут извлечены следующие термы для вставки в полнотекстовый индекс: "right now they re very frustrated". Когда для поиска документа будет введен такой запрос как "MATCH 'Frustrated'", токенайзер "simple" трансформирует терм запроса в нижний регистр перед поиском по полнотекстовому индексу. Вместе с токенайзером "simple", исходный код FTS содержит также токенайзер на основе алгоритма стеминга Портера. Это токенайзер использует те же правила для разделения документа на термы и приводит их к нижнему регистру, но кроме этого он еще использует алгоритм стеминга Портера для приведения слов английского языка к основе. Например, обрабатывая тот же документ, что и в предыдущем абзаце, токенайзер Портера выделит в нем следующие токены: "right now thei veri frustrat". Хотя некоторые из этих термов не являются словами английского языка, в некоторых случаях их использование в полнотекстовом индексе делает поисковую выдачу более интеллектуальной, чем в случае токенайзера "simple". При использовании токенайзера "porter" наш примерный документ может быть найден не только запросом "MATCH 'Frustrated'", но и таким как "MATCH 'Frustration'", поскольку и терм "Frustration", и терм "Frustrated" приводятся алгоритмом стеминга Портера к одинаковой основе "frustrat". Таким образом, при использовании токенайзера "porter", FTS может находить не только точные совпадения запрашиваемых термов, но также и совпадения с другими похожими англоязычными термами. Более подробно с алгоритмом стеминга Портера можно ознакомиться по приведенной ссылке. Пример, иллюстрирующий разницу между токенайзерами "simple" и "porter":
-- Создаем таблицу с использованием токенайзера "simple".
-- Вставляем в нее документ.
CREATE VIRTUAL TABLE simple USING fts3(tokenize=simple);
INSERT INTO simple VALUES('Right now they''re very frustrated');
-- Первый из следующих двух запросов найдет документ, сохранённый в таблице
-- "simple". Второй - не найдет.
SELECT * FROM simple WHERE simple MATCH 'Frustrated';
SELECT * FROM simple WHERE simple MATCH 'Frustration';
-- Создаем таблицу с использование токенайзера "porter". Вставляем в нее тот
-- же самый документ.
CREATE VIRTUAL TABLE porter USING fts3(tokenize=porter);
INSERT INTO porter VALUES('Right now they''re very frustrated');
-- Оба следующих запроса найдут документ, сохранённый в таблице
-- "porter".
SELECT * FROM porter WHERE porter MATCH 'Frustrated';
SELECT * FROM porter WHERE porter MATCH 'Frustration';
Если расширение скомпилировано с опцией препроцессора
CREATE VIRTUAL TABLE thai_text USING fts3(text, tokenize=icu th_TH) Реализация токенайзера ICU очень проста. Он разбивает введённый текст согласно правилам ICU для нахождения границ слов и отбрасывает все токены, которые целиком состоят из пробелов. Он может оказаться полезным для некоторых приложений с некоторыми локализациями, но не для всех. Если требуется более сложная обработка, например для реализации стеминга или для отбрасывания пунктуации, может потребоваться создание токенайзера, который будет использовать токенайзер ICU как часть собственной реализации. 5.1. Кастомные токенайзеры (реализуемые пользователями)Вместе со встроенными токенайзерами Регистрация нового токенайзера FTS похожа на регистрацию нового модуля
виртуальных таблиц в SQLite. Пользователь передает указатели на структуру,
содержащую указатели на различные функции обратного вызова, которые и составляют
реализацию нового типа токенайзера. Для токенайзеров эта структура называется
FTS не выставляет напоказ функции на C, которые пользователь вызывает для
регистрации нового токенайзера. Вместо этого указатель на нее должен быть
зашифрован как значение BLOB и посредством SQL передан FTS. Для этого
предназначена специальная скалярная функция SELECT fts3_tokenizer(<tokenizer-name>); SELECT fts3_tokenizer(<tokenizer-name>, <sqlite3_tokenizer_module ptr>); где <tokenizer-name> — это строка, идентифицирующая токенайзер, а
<sqlite3_tokenizer_module ptr="1"> — указатель на структуру в
ПРЕДУПРЕЖДЕНИЕ БЕЗОПАСНОСТИ: Если расширение FTS3/4
используется в окружении, в котором потенциальные злоумышленники могут выполнять
произвольные запросы SQL, то следует заранее предохраниться от вызовов функции
Следующий блок содержит пример вызова функции /*
** Регистрирует реализацию токенайзера для FTS3 или FTS4.
*/
int registerTokenizer(
sqlite3 *db,
char *zName,
const sqlite3_tokenizer_module *p
){
int rc;
sqlite3_stmt *pStmt;
const char *zSql = "SELECT fts3_tokenizer(?, ?)";
rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
if( rc!=SQLITE_OK ){
return rc;
}
sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC);
sqlite3_bind_blob(pStmt, 2, &p, sizeof(p), SQLITE_STATIC);
sqlite3_step(pStmt);
return sqlite3_finalize(pStmt);
}
/*
** Запрашивает у FTS реализацию токенайзера по имени zName.
*/
int queryTokenizer(
sqlite3 *db,
char *zName,
const sqlite3_tokenizer_module **pp
){
int rc;
sqlite3_stmt *pStmt;
const char *zSql = "SELECT fts3_tokenizer(?)";
*pp = 0;
rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
if( rc!=SQLITE_OK ){
return rc;
}
sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC);
if( SQLITE_ROW==sqlite3_step(pStmt) ){
if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){
memcpy(pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp));
}
}
return sqlite3_finalize(pStmt);
}
Перевод Дмитрия Скоробогатова, 03.06.2011 Предыдущие публикации: Последнее редактирование: 2011-06-03 15:26:12 Метки материала: токенайзеры, sqlite, fts3, fts4, базы данных, программирование, db, sql, разработка по Оставьте, пожалуйста, свой комментарий к публикации |
||||||
© 2007-2012, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.