Интернет, компьютеры, софт и прочий Hi-Tech | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Избранные докиМетки (все метки)hi tech, internet, it, интернет, информационные технологии, ит, по, программное обеспечение, сайт, софт
Подписаться через RSS2Email.ru
Дополнительнооптимизация, сайт, мониторы, движок, Битрикс, хостинг, сайты, мобильные, электроника, видеокарта |
SQLite: расширения FTS3 и FTS4
Содержание
4. Вспомогательные функции — Snippet, Offsets и MatchinfoМодули FTS3 и FTS4 предоставляют три специальные скалярные функции SQL, которые могут быть полезны разработчикам систем полнотекстового поиска: "snippet", "offsets" и "matchinfo". Назначение функций "snippet" и "offsets" — дать пользователю возможность узнать местоположение запрашиваемых термов в найденных документах. Функция "matchinfo" предоставляет пользователю набор числовых значений, которые могут быть использованы для фильтрации и сортировки результатов по релевантности. Первым аргументом всех трех этих специальных скалярных функций SQL должен быть скрытый столбец той таблицы FTS, к которой применяется функция. Скрытый столбец FTS генерируется автоматически для каждой таблицы FTS и имеет то же самое имя, что и сама таблица FTS. Пусть, например, дана таблица FTS по имени "mail". Тогда можно так обращаться к специальным функциям:
SELECT offsets(mail) FROM mail
WHERE mail MATCH <выражение полнотекстового запроса>;
SELECT snippet(mail) FROM mail
WHERE mail MATCH <выражение полнотекстового запроса>;
SELECT matchinfo(mail) FROM mail
WHERE mail MATCH <выражение полнотекстового запроса>;
Эти три вспомогательных функции полезны только в тех запросах
Все три вспомогательные функции извлекают из выражения запроса
FTS набор "искомых фраз" и работают с ними. Этот набор искомых фраз для данного
запроса состоит из всех фраз (включая закавыченные токены и префиксы токенов) в
выражении за исключением тех, перед которыми стоит унарный оператор "-"
(стандартный синтаксис), и тех, которые являются частью подвыражения справа от
оператора Каждая серия токенов в таблице FTS, которая совпадает с одной из искомых фраз запроса, называется "фразовым соответствием" со следующими оговорками:
4.1. Функция OffsetsДля запроса
Следующий блок содержит примеры использования функции
CREATE VIRTUAL TABLE mail USING fts3(subject, body);
INSERT INTO mail
VALUES('hello world', 'This message is a hello world message.');
INSERT INTO mail
VALUES('urgent: serious', 'This mail is seen as a more serious mail');
-- Следующий запрос возвращает единственную запись (вставленную первой в
-- таблицу "mail"). Текст, выданный функцией offsets, будет следующий:
-- "0 0 6 5 1 0 24 5".
--
-- Первые четыре числа этого результата указывают на то, что столбец с индексом
-- 0 (subject) содержит терм с индексом 0 ("world") со смещением в 6 байт от
-- начала, а сам этот терм имеет длину в 5 байт. Следующие четыре числа
-- показывают, что столбец 1 (body) содержит терм 0 ("world") со смещением в 24
-- байта, и сам этот терм имеет длину в 5 байт.
SELECT offsets(mail) FROM mail WHERE mail MATCH 'world';
-- Следующий запрос также возвращает только одну первую строку из таблицы
-- "mail". В этом случае получим текст "1 0 5 7 1 0 30 7".
SELECT offsets(mail) FROM mail WHERE mail MATCH 'message';
-- Следующий запрос найдет вторую строку из таблицы "mail". Он выдаст текст
-- "1 0 28 7 1 1 36 4". Учитываться будут только те слова "serious" и "mail",
-- которые встречаются как часть фразы "serious mail". Другие вхождения
-- "serious" и "mail" игнорируются.
SELECT offsets(mail) FROM mail WHERE mail MATCH '"serious mail"';
4.2. Функция SnippetФункция
Функция Если такой текстовый фрагмент может быть найден, он будет выдан со следующими изменениями:
Если будет найдено более одного подходящего фрагмента, то предпочтение будет отдано тем фрагментам, которые содержат большее число "дополнительных" искомых фраз. Начало выбранного текстового фрагмента может быть перемещено на несколько токенов вперед или назад в попытке собрать все попавшие в него искомые фразы в середину фрагмента. Если N имеет положительное значение, и несуществует фрагментов,
которые содержат совпадения для всех искомых фраз, функция Если N — отрицательное значение и единственный фрагмент, содержащий
нужные фразовые совпадения, найти невозможно, функция После нахождения M фрагментов, где M может принимать значения от двух до четырех, как описано в предыдущем абзаце, они соединяются вместе через "троеточие" в том порядке, в каком находились в документе. После выполнения перечисленных выше преобразований, результирующий текст возвращается функцией.
-- Замечание: в примерах этого блока символы новой строки и пробелы,
-- входящие в документ, вставляемый в таблицу FTS, ожидаются, соответственно, в
-- результатах, которые описываются в SQL-комментариях. Однако в целях
-- читабельности примеров эти результаты опубликованы не так, как они выглядят
-- при выводе реальных команд SQLite.
-- Создаем и заполняем таблицу FTS.
CREATE VIRTUAL TABLE text USING fts4();
INSERT INTO text VALUES('
During 30 Nov-1 Dec, 2-3oC drops. Cool in the upper portion, minimum
temperature 14-16oC and cool elsewhere, minimum temperature 17-20oC. Cold to
very cold on mountaintops, minimum temperature 6-12oC. Northeasterly winds
15-30 km/hr. After that, temperature increases. Northeasterly winds 15-30
km/hr.
');
-- Следующий запрос выведет такое текстовое значение:
--
-- "<b>...</b>cool elsewhere, minimum temperature 17-20oC.
-- <b>Cold</b> to very <b>cold</b> on mountaintops,
-- minimum temperature 6<b>...</b>".
--
SELECT snippet(text) FROM text WHERE text MATCH 'cold';
-- Следующий запрос выведет такое текстовое значение:
--
-- "...the upper portion, [minimum] [temperature] 14-16oC and cool elsewhere,
-- [minimum] [temperature] 17-20oC. Cold..."
--
SELECT snippet(text, '[', ']', '...') FROM text WHERE text MATCH '"min* tem*"'
4.3. Функция MatchinfoФункция При вызове функция Символы в строке формата для
Например: -- Создаем и заполняем таблицу FTS4 с двумя столбцами:
CREATE VIRTUAL TABLE t1 USING fts4(a, b);
INSERT INTO t1 VALUES('transaction default models default', 'Non transaction reads');
INSERT INTO t1 VALUES('the default transaction', 'these semantics present');
INSERT INTO t1 VALUES('single request', 'default data');
-- В следующем запросе строка формата не указывается. Поэтому используется
-- умолчальная "pcx". Поэтому результатом запроса будет единственная строка,
-- содержащая бинарные данные объемом в 80 байт (20 32-битных целых - 1 для "p",
-- 1 для "c" и 3*2*3 для "x"). Если каждый блок из 4 байтов интерпретировать как
-- беззнаковое целое в машинном порядке байт, то получим следующую
-- последовательность:
--
-- 3 2 1 3 2 0 1 1 1 2 2 0 1 1 0 0 0 1 1 1
--
-- Строка результата соответствует второй вставленной в таблицу t1 записи.
-- Первые два числа в последовательности показывают, что запрос содержит три
-- фразы и что поиск в таблице осуществляется по двум столбцам. Следующий блок
-- из трех целых чисел сообщает сведения о столбце 0 (в данном случае "a") и
-- фразе 0 (в данном случае "default"): найденная строка содержит 1 вхождение
-- "default" в столбце 0; всего в столбце 0 по всей таблице слово "default"
-- встречается 3 раза; слово присутствует в 2 записях.
--
-- Следующая тройка чисел (0 1 1) показывает число вхождений "default" в столбец
-- 1 (0 для данной строки, 1 для всех строк, 1 строка с вхождением).
--
SELECT matchinfo(t1) FROM t1 WHERE t1 MATCH 'default transaction "these semantics"';
-- Строка формата для следующего запроса - "nl". Поэтому возвращаемый массив
-- содержит 3 целочисленных значения - 1 для "n" и 2 для "l". Запрос находит две
-- строки (первые две строки, вставленные в таблицу). Выдача будет следующей:
--
-- 3 1 1
-- 3 2 0
--
-- Первое число в массиве, выданном matchinfo, одинаково для обеих строк и равно
-- 3 (число строк в таблице). Следующие два числа - это длины (в словах) самых
-- длинных подпоследовательностей фраз, найденных в соответствующих столбцах.
--
SELECT matchinfo(t1, 'nl') FROM t1 WHERE t1 MATCH 'default transaction';
Функция SELECT docid, matchinfo(tbl) FROM tbl WHERE tbl MATCH <query expression>; SELECT docid, offsets(tbl) FROM tbl WHERE tbl MATCH <query expression>; Функция
Перевод Дмитрия Скоробогатова, 02.06.2011 Предыдущие публикации: Последнее редактирование: 2011-06-02 20:17:09 Метки материала: функции, snippet, offsets, matchinfo, sqlite, fts3, fts4, базы данных, db, sql, программирование Оставьте, пожалуйста, свой комментарий к публикации |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
© 2007-2012, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.