Токенайзери - sqlite розширення fts3 і fts4

5. Токенайзери

Токенайзер FTS - це набір правил для вилучення термів з документа або простого повнотекстового запиту FTS.

Якщо при створенні таблиці FTS в запиті CREATE VIRTUAL TABLE не було зазначено якийсь специфічний токенайзер, то буде використаний умолчальне токенайзер, яким є "simple". Цей найпростіший токенайзер виділяє токени з документа або простого повнотекстового запиту FTS за такими правилами:

Терм - це безперервна послідовність припустимих символів, де допустимими є всі символи букв і цифр, символ "_", а також всі символи кодування UTF, код яких більше або дорівнює 128. Всі інші символи відкидаються при розбивці документа на терми. Вони враховуються тільки як роздільники поруч стоять термів.

Під час процесу токенізаціі все символи в верхньому регістрі з набору ASCII (з кодами UTF меншими 128), перетворюються в свої еквіваленти в нижньому регістрі. В результаті при використанні токенайзера simple повнотекстові запити стають регістронезавісімого.

Нехай, наприклад, документ містить текст "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":

Якщо розширення скомпільовано з опцією препроцесора SQLITE_ENABLE_ICU. то існує вбудований токенайзер по імені "icu", реалізований за допомогою бібліотеки ICU. Перший аргумент методу xCreate () (дивіться fts3_tokenizer.h) цього токенайзера може бути ідентифікатором локалі ICU. Наприклад, "tr_TR" для турецької мови, використовуваного в Туреччині, або "en_AU" для англійської мови, використовуваного в Австралії. приклад:

Реалізація токенайзера ICU дуже проста. Він розбиває введений текст згідно з правилами ICU для знаходження меж слів і відкидає всі токени, які цілком складаються з прогалин. Він може виявитися корисним для деяких додатків з деякими локалізаціями, але не для всіх. Якщо потрібно більш складна обробка, наприклад для реалізації стемінга або для відкидання пунктуації, може знадобитися створення токенайзера, який буде використовувати токенайзер ICU як частину своєї реалізації.

5.1. Кастомниє токенайзери (реалізовані користувачами)

Разом з вбудованими токенайзерамі "simple". "Porter" і (можливо) "icu" FTS надає інтерфейс, що дозволяє самим користувачам створювати власні токенайзери на мові C. Цей інтерфейс, використовуваний для створення нових токенайзеров, визначається і описується в файлі вихідного коду fts3_tokenizer.h.

Реєстрація нового токенайзера FTS схожа на реєстрацію нового модуля віртуальних таблиць в SQLite. Користувач передає покажчики на структуру, яка містить покажчики на різні функції зворотного виклику, які і складають реалізацію нового типу токенайзера. Для токенайзеров ця структура називається "sqlite3_tokenizer_module". Вона визначається у файлі fts3_tokenizer.h.

FTS не виставляє напоказ функції на C, які користувач викликає для реєстрації нового токенайзера. Замість цього покажчик на неї повинен бути зашифрований як значення BLOB і за допомогою SQL переданий FTS. Для цього призначена спеціальна скалярная функція "fts3_tokenizer ()". Ця функція повинна бути викликана з одним або двома аргументами, як показано нижче:

де - це рядок, що ідентифікує токенайзер, а - покажчик на структуру в sqlite3_tokenizer_module в SQL-форматі BLOB. Якщо цей другий аргумент вказано, він буде зареєстрований як токенайзер і буде повернута його копія. Якщо ж вказаний тільки один аргумент, то в якості покажчика на реалізацію токенайзера буде прийнятий поточний, який і буде повернений у вигляді, закодованому в BLOB. Або, якщо такого токенайзера не існує, буде мати місце помилка SQL (exception).

Наступний блок містить приклад виклику функції fts3_tokenizer () в коді на C: