@Whiteha

SQLite FTS5 usage, what does xToken() do in xTokenize()?

В интерфейсе sqlite для расширений файл fts5.h определяет структурку fts5_tokenizer, у которой есть указатель на функцию xTokenize()
int(*xTokenize)(Fts5Tokenizer*,
			void *pCtx,
			int flags,            /* Mask of FTS5_TOKENIZE_* flags */
			const char *pText, int nText,
			int(*xToken)(
				void *pCtx,         /* Copy of 2nd argument to xTokenize() */
				int tflags,         /* Mask of FTS5_TOKEN_* flags */
				const char *pToken, /* Pointer to buffer containing token */
				int nToken,         /* Size of token in bytes */
				int iStart,         /* Byte offset of token within input text */
				int iEnd            /* Byte offset of end of token within input text */
				)
			);


один из аргументов которой коллбек xToken(). У меня не получается выудить из доков и интернета роль данного коллбека. Должны ли мы написать тут свой, или это некий коллбек, который предоставляет внутренняя реализация sqlite? Обязаны ли мы его вызывать? Что он делает с нашими данными? Если его должны реализовать мы, то как мы можем передать свой с вызовом xTokenize(), если этот вызов обеспечивают внутренности sqlite?
  • Вопрос задан
  • 310 просмотров
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C++
В https://sqlite.org/fts5.html#section_7_1 ясно написано:


xTokenize:
This function is expected to tokenize the nText byte string indicated by argument pText. pText may or may not be nul-terminated. The first argument passed to this function is a pointer to an Fts5Tokenizer object returned by an earlier call to xCreate().
..........
For each token in the input string, the supplied callback xToken() must be invoked.

ВЫ пишете тройку функций xCreate, xDelete, xTokenize. При вызове вашей xTokenize ей будет передан колбэк, который, как правильно подметил abcd0x00 , нужно будет дергать для передачи движку SQLite готовой (т.е. подготовленной ВАМИ в процессе работы xTokenize) лексемы. Они называют это токен, но вообще это лексема, т.к. вы отдаете кусок из входной строки.
Итого, все максимально просто - вам дается строка, вы по своим алгоритмам и критериям решаете, где в ней какие лексемы. Для каждой найденной лексемы дергаете данный вам xToken, чтобы сообщить эту радостную новость SQLite.
Обязаны ли мы его вызывать?

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

его реализует SQLite.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы