Функции и операторы текстового поиска PostgreSQL
Вступление
PostgreSQL предоставляет два типа данных для поддержки полнотекстового поиска, один из них - tsvector, а другой - тип tsquery. Тип tsvector представляет документ в форме, оптимизированной для текстового поиска; тип tsquery аналогично представляет текстовый запрос.
Значение tsvector - это отсортированный список различных лексем, которые представляют собой слова, которые были нормализованы для объединения различных вариантов одного и того же слова. Сортировка и удаление дубликатов выполняются автоматически во время ввода, как показано в этом примере:
SELECT 'толстая крыса сидела на коврике, а безумная кошка съела крысу' :: tsvector; поисковый вектор -------------------------------------------------- -------------- 'a' 'и' 'съели' 'cat' 'fat' 'mad' 'mat' 'на' 'rat' 'sat' 'the' (1 ряд)
Здесь в приведенном выше примере документ преобразован в тип данных tsvector.
Чтобы представить лексемы, содержащие пробелы или знаки пунктуации, заключите их в кавычки, вот следующий пример.
SELECT $$ лексема '' содержит пробелы $$ :: tsvector; поисковый вектор ------------------------------------------- '' 'содержит' 'лексему' 'пробелы' 'the' (1 ряд)
В приведенном выше примере строка в кавычках использовалась в качестве литералов.
Чтобы представить лексемы, содержащие пробелы или знаки пунктуации, заключите их в кавычки, вот следующий пример.
SELECT $$ лексема '' содержит пробелы $$ :: tsvector; поисковый вектор ------------------------------------------- '' 'содержит' 'лексему' 'пробелы' 'the' (1 ряд)
Необязательно, целые позиции могут быть присоединены к лексемам, вот пример ниже.
SELECT $$ лексема '' содержит пробелы $$ :: tsvector; поисковый вектор -------------------------------------------------- ----------------------------- 'a': 1,6,10 'и': 8 'съел': 9 'кошка': 3 'жир': 2,11 'циновка': 7 'на': 5 'крыса': 12 'сат': 4 (1 ряд)
Позиция обычно указывает местоположение исходного слова в документе. Значения положения могут варьироваться от 1 до 16383; Дубликаты позиций для одной и той же лексемы отбрасываются.
Лексемы, имеющие позиции, могут быть дополнительно помечены весом, который может быть A, B, C или D. D является значением по умолчанию и, следовательно, не отображается в выходных данных:
ВЫБЕРИТЕ 'a: 1A жир: 2B, 4C cat: 5D' :: tsvector; поисковый вектор ---------------------------- «a»: 1A «кошка»: 5 «жир»: 2B, 4C (1 ряд)
Для реализации полнотекстового поиска должна быть функция для создания tsvector из документа и tsquery из пользовательского запроса. PostgreSQL предоставляет функцию to_tsvector для преобразования документа в тип данных tsvector. To_tsvector анализирует текстовый документ в токены, превращает токены в лексемы и возвращает tsvector, который перечисляет лексемы вместе с их позициями в документе.
Операторы текстового поиска
оператор | Описание | пример | Результат |
---|---|---|---|
@@ | цветматчецквест? | SELECT to_tsvector ('толстые кошки ели крыс') @@ to_tsquery ('cat & rat'); | ? Колонок? ---------- T (1 ряд) |
@@@ | устарел синоним [электронная почта защищена] @ | SELECT to_tsvector ('толстые кошки ели крыс') @@@ to_tsquery ('cat & rat'); | ? Колонок? ---------- T (1 ряд) |
|| | concatenatetsvectors | ВЫБЕРИТЕ 'a: 1 b: 2' :: tsvector || 'c: 1 d: 2 b: 3' :: tsvector; | ? Колонок? --------------------------- 'a': 1 'b': 2,5 'c': 3 'd': 4 (1 ряд) |
&& | ANDtsquerys вместе | ВЫБЕРИТЕ 'толстый | rat ':: tsquery &&' cat ':: tsquery; | ? Колонок? --------------------------- ("толстый" | "крыса") и "кошка" (1 ряд) |
|| | ИЛИ tsquerys вместе | ВЫБЕРИТЕ 'толстый | rat ':: tsquery || 'Кошка' :: tsquery; | ? Колонок? --------------------------- («толстый» | «крыса») | 'кошка' (1 ряд) |
!! | отрицать atsquery | ВЫБРАТЬ !! 'Кошка' :: tsquery; | ? Колонок? ---------- !'кошка' (1 ряд) |
@> | tsquery содержит другое? | ВЫБЕРИТЕ 'cat' :: tsquery @> 'cat & rat' :: tsquery; | ? Колонок? ---------- е (1 ряд) |
<@ | tsquery содержится в? | ВЫБЕРИТЕ 'cat' :: tsquery <@ 'cat & rat' :: tsquery; | ? Колонок? ---------- T (1 ряд) |
В дополнение к операторам, показанным в таблице, обычные операторы сравнения B-деревьев (=, <и т. Д.) Определены для типов tsvector и tsquery. Они не очень полезны для текстового поиска, но позволяют, например, создавать уникальные индексы на столбцах этих типов.
Функции текстового поиска
функция get_current_ts_config ()
Эта функция используется для получения конфигурации текстового поиска по умолчанию.
Синтаксис:
get_current_ts_config ()
Тип возврата : regconfig
пример
Код:
SELECT get_current_ts_config();
Вот результат.
Пример вывода:
get_current_ts_config ----------------------- английский (1 ряд)
функция length ()
Эта функция используется для получения количества лексем в цветекторе.
Синтаксис:
Длина (поисковый вектор)
Тип возврата : целое число
пример
Код:
SELECT length('fat:2,4 cat:3 rat:5A mat:1'::tsvector);
Вот результат.
Пример вывода:
длина -------- 4 (1 ряд)
функция numnode ()
Эта функция используется для получения количества лексем и операторов в tsquery.
Синтаксис:
numnode (tsquery)
Тип возврата : целое число
пример
Код:
SELECT numnode('(mat & cat) | bat'::tsquery);
Вот результат.
Пример вывода:
numnode --------- 5 (1 ряд)
функция plainto_tsquery ()
Эта функция используется для создания запроса, игнорирующего пунктуацию.
Синтаксис:
plainto_tsquery ([config regconfig,] текст запроса)
Тип возврата : tsquery
пример
Код:
SELECT plainto_tsquery('english', 'The Bad Cats');
Вот результат.
Пример вывода:
plainto_tsquery ----------------- 'Плохая кошка' (1 ряд)
функция querytree ()
Эта функция используется для получения индексируемой части запроса.
Синтаксис:
querytree (запрос tsquery)
Тип возврата : текст
пример
Код:
SELECT querytree('fat & ! cat'::tsquery);
Вот результат.
Пример вывода:
querytree ----------- 'жир' (1 ряд)
функция setweight ()
Эта функция используется для присвоения веса каждому элементу цветектора.
Синтаксис:
установленный вес (цветок, "символ")
Тип возвращаемого значения : tsvector
пример
Код:
SELECT setweight('sat:1,5 bat:3 rat:2B'::tsvector, 'A');
Вот результат.
Пример вывода:
setweight ------------------------------- «Летучая мышь»: 3А «Крыса»: 2А «Сидела»: 1А, 5А
Вот еще один пример.
Код:
SELECT setweight('sat:1,5 bat:3 rat:2B'::tsvector, 'D');
Вот результат.
Пример вывода:
setweight --------------------------- 'летучая мышь': 3 'крыса': 2 'сат': 1,5 (1 ряд)
функция strip ()
Эта функция используется для удаления позиций и весов из цвектора.
Синтаксис:
полоса (поисковый вектор)
Тип возвращаемого значения : tsvector
пример
Код:
SELECT strip('fat:2,5 cat:1 rat:4A'::tsvector);
Вот результат.
Пример вывода:
полоса ------------------- 'кошка' 'толстая' 'крыса' (1 ряд)
функция to_tsquery ()
Эта функция используется для нормализации слов и преобразования в tsquery.
Синтаксис:
to_tsquery ([config regconfig,] текст запроса)
Тип возврата : tsquery
пример
Код:
SELECT to_tsquery('english', 'The & Pet & Cats');
Вот результат.
Пример вывода:
to_tsquery --------------- 'Домашняя кошка' (1 ряд)
функция to_tsvector ()
Эта функция используется для уменьшения текста документа до цвета.
Синтаксис:
to_tsvector ([config regconfig,] текст документа)
Тип возвращаемого значения : tsvector
пример
Код:
SELECT to_tsvector('english', 'The Fat Rats');
Вот результат.
Пример вывода:
to_tsvector ----------------- «толстый»: 2 «крысиный»: 3 (1 ряд)
функция ts_headline ()
Эта функция используется для отображения соответствия запроса.
Синтаксис:
ts_headline ([config regconfig,] текст документа, запрос tsquery [, текст параметров])
Тип возврата : текст
пример
Код:
SELECT ts_headline('x y z', 'z'::tsquery);
Вот результат.
Пример вывода:
ts_headline -------------- xy z (1 ряд)
функция ts_rank ()
Эта функция используется для ранжирования документа по запросу.
Синтаксис:
ts_rank ([weights float4 [],] векторный tsvector, запрос tsquery [, целое число нормализации])
Тип возврата : float4
пример
Код:
SELECT ts_rank(to_tsvector('The quick brown fox jumps over the lazy dog.'),
to_tsquery('fox'));
Это обычный запрос, в котором мы передаем строку, которую мы преобразуем в tsvector, и токен, который преобразуется в tsquery. Вот результат рейтинга.
Пример вывода:
ts_rank ----------- 0.0607927 (1 ряд)
Вот еще один.
Код:
SELECT ts_rank(to_tsvector('The quick brown fox jumps over the lazy dog.'),
to_tsquery('fox & dog'));
Теперь мы хотим запросить два жетона лиса и пса. Мы объединяем их в цепочку AND (&). Вот результат рейтинга.
Пример вывода:
ts_rank --------- 0,09149 (1 ряд)
Вот еще один с большим количеством жетонов.
Код:
SELECT ts_rank(to_tsvector('The quick brown fox jumps over the lazy dog.'),
to_tsquery('fox & dog & lazy'));
Чем больше токенов соответствует строке, тем выше будет рейтинг. Вот рейтинг.
Пример вывода:
ts_rank --------- 0,25948 (1 ряд)
функция ts_rank_cd ()
Эта функция используется для ранжирования документа по запросу с использованием плотности покрытия.
Синтаксис:
ts_rank_cd ([weights float4 [],] векторный tsvector, запрос tsquery [, целое число нормализации])
Тип возврата : float4
пример
Код:
SELECT ts_rank_cd('{0.1, 0.2, 0.4, 1.0}', to_tsvector('PostgreSQL full text search is a wonderful methode'),
to_tsquery('wonderful'));
Вот результат.
Пример вывода:
ts_rank_cd ------------ 0,1 (1 ряд)
функция ts_rewrite ()
Эта функция используется для поиска заданного запроса в целевом запросе и заменяет его вхождения замещающим запросом.
Синтаксис:
ts_rewrite (запрос tsquery, целевой tsquery, замещающий tsquery)
Тип возврата : tsquery
пример
Код:
SELECT ts_rewrite('c & b'::tsquery, 'b'::tsquery, 'bad|bat'::tsquery);
Вот результат.
Пример вывода:
ts_rewrite ------------------------- («плохо» | «летучая мышь») и «с» (1 ряд)
функция ts_rewrite ()
Эта функция используется для замены с использованием целей и подстановок из команды SELECT.
Синтаксис:
ts_rewrite (запрос tsquery, выделение текста)
Тип возврата : tsquery
пример
Код:
CREATE TABLE test (col1 tsquery PRIMARY KEY, COL2 tsquery);
INSERT INTO test values ('p','q');
SELECT ts_rewrite('r & q'::tsquery, 'SELECT col1,col2 FROM test');
Вот результат.
Пример вывода:
ts_rewrite ------------ 'r' & 'q' (1 ряд)
Вот еще один.
Код:
SELECT ts_rewrite('p & q'::tsquery, 'SELECT col1,col2 FROM test WHERE ''p & q'::tsquery @> col1);
Вот результат.
Пример вывода:
ts_rewrite ------------ 'q' & 'q' (1 ряд)
функция tsvector_update_trigger ()
Эта функция запускает функцию для автоматического обновления столбца tsvector
Синтаксис:
tsvector_update_trigger ()
Тип возврата : триггер
Вот пошаговый процесс для выполнения примера.
Сначала создайте таблицу mytable. CREATE TABLE mytable ( текст заголовка, основной текст, цв цвектор); Здесь мы создаем триггер tsvectorupdate. СОЗДАЙТЕ TRIGGER tsvectorupdate ПЕРЕД ВСТАВКОЙ ИЛИ ОБНОВЛЕНИЕМ НА mytable ДЛЯ КАЖДОЙ СТРОКИ ВЫПОЛНИТЬ ПРОЦЕДУРУ tsvector_update_trigger (TSV, 'pg_catalog.english', название, тела); Здесь мы вставляем один ряд в mytable. INSERT INTO mytable VALUES («здесь заголовок», «здесь текст сообщения»); Вот таблица mytable: postgres = # SELECT * FROM mytable; название | тело | TSV --------------- + ----------------------- + ---------- ------------------ вот название | вот основной текст | 'bodi': 7 'text': 8 'titl': 3 (1 ряд) Теперь посмотрим на запрос: ВЫБЕРИТЕ заголовок, тело ИЗ mytable WHERE [электронная почта защищена] @ to_tsquery ('title & body'); Вот результат. название | тело --------------- + ----------------------- вот название | вот основной текст (1 ряд)
Функции отладки текстового поиска
Функции перечислены отдельно, потому что они обычно не используются в повседневных операциях поиска текста. Они полезны для разработки и отладки новых конфигураций текстового поиска.
функция ts_debug ()
протестировать конфигурацию
Синтаксис:
ts_debug ([config regconfig,] текст документа, текст псевдонима OUT, текст описания OUT, текст маркера OUT, словарь OUT regdictionary [], словарь OUT словарь, текст лексемы OUT [])
Тип возврата : набор записей
пример
Код:
SELECT ts_debug('english', 'The earth is round.');
Вот результат.
Пример вывода:
ts_debug -------------------------------------------------- ----------------------- (asciiword, "Word, all ASCII", The, {english_stem}, english_stem, {}) (пусто, "Пробел", "", {} ,,) (asciiword, "Слово, все ASCII", земля, {english_stem}, english_stem, {земля}) (пусто, "Пробел", "", {} ,,) (asciiword, "Слово, все ASCII", есть, {english_stem}, english_stem, {}) (пусто, "Пробел", "", {} ,,) (asciiword, "Word, all ASCII", round, {english_stem}, english_stem, {round}) (пусто, "Пробелы",., {} ,,) (8 рядов)
функция ts_lexize ()
Эта функция используется для проверки словаря.
Синтаксис:
ts_lexize (dict regdictionary, текст токена)
Тип возврата : текст []
пример
Код:
SELECT ts_lexize('english_stem', 'animals');
Вот результат.
Пример вывода:
ts_lexize ----------- {} Anim (1 ряд)
функция ts_parse ()
проверить парсер
Синтаксис:
ts_parse (текст parser_name, текст документа, целое число маркера OUT, текст токена OUT)
Тип возврата : набор записей
пример
Код:
SELECT ts_parse('default', 'bad - cat');
Вот результат.
Пример вывода:
ts_parse ----------- (1, плохо) (12, "") (12, "-") (1, кошки) (4 ряда)
функция ts_parse ()
Эта функция используется для проверки парсера.
Синтаксис:
ts_parse (parser_oid oid, текст документа, целое число маркера OUT, текст токена OUT)
Тип возврата : набор записей
пример
Код:
SELECT ts_parse(3722, 'bad - cat');
Вот результат.
Пример вывода:
ts_parse ----------- (1, плохо) (12, "") (12, "-") (1, кошки) (4 ряда)
функция ts_token_type ()
получить типы токенов, определенные парсером
Синтаксис:
ts_token_type (текст parser_name, целое число OUT tokid, текст псевдонима OUT, текст описания OUT)
Тип возврата : набор записей
пример
Код:
SELECT ts_token_type('default');
Вот результат.
Пример вывода:
ts_token_type -------------------------------------------------- ------------ (1, asciiword, "Слово, все ASCII") (2, слово «Слово, все буквы») (3, numword, «Слово, буквы и цифры») (4, электронная почта, «адрес электронной почты») (5, URL, URL-адрес) (6, хост, хост) (7, сфлот, «Научная нотация») (8, версия, «Номер версии») (9, hword_numpart, «Часть переноса слов, букв и цифр») (10, hword_part, "Часть переноса слов, все буквы") (11, hword_asciipart, «Часть переноса слов, все ASCII») (12, пробел, "Символы пробела") (13, тег «XML-тег») (14, протокол «Протокол главы») (15, numhword, «Переносные слова, буквы и цифры») (16, asciihword, "Переносное слово, все ASCII") (17, меч, «Переносное слово, все буквы») (18, url_path, "URL-путь") (19, файл «Файл или имя пути») (20, float, «Десятичная запись») (21, int, «Подписанное целое число») (22, uint, "Целое число без знака") (23, сущность, «сущность XML») (23 ряда)
функция ts_token_type ()
Эта функция используется для получения типов токенов, определенных парсером.
Синтаксис:
ts_token_type (parser_oid oid, целое число OUT tokid, текст псевдонима OUT, текст описания OUT)
Тип возврата : набор записей
пример
Код:
SELECT ts_token_type(3722);
Вот результат.
Пример вывода:
ts_token_type -------------------------------------------------- ------------ (1, asciiword, "Слово, все ASCII") (2, слово «Слово, все буквы») (3, numword, «Слово, буквы и цифры») (4, электронная почта, «адрес электронной почты») (5, URL, URL-адрес) (6, хост, хост) (7, сфлот, «Научная нотация») (8, версия, «Номер версии») (9, hword_numpart, «Часть переноса слов, букв и цифр») (10, hword_part, "Часть переноса слов, все буквы") (11, hword_asciipart, «Часть переноса слов, все ASCII») (12, пробел, "Символы пробела") (13, тег «XML-тег») (14, протокол «Протокол главы») (15, numhword, «Переносные слова, буквы и цифры») (16, asciihword, "Переносное слово, все ASCII") (17, меч, «Переносное слово, все буквы») (18, url_path, "URL-путь") (19, файл «Файл или имя пути») (20, float, «Десятичная запись») (21, int, «Подписанное целое число») (22, uint, "Целое число без знака") (23, сущность, «сущность XML») (23 ряда)
функция ts_stat ()
Эта функция используется для получения статистики столбца tsvector.
Синтаксис:
ts_stat (текст sqlquery, [взвешивает текст,] текст OUT word, OUT ndoc integer, OUT nentry integer)
Тип возврата : набор записей
пример
Вот таблица mytable: postgres = # SELECT * FROM mytable; название | тело | TSV --------------- + ----------------------- + ---------- ------------------ вот название | вот основной текст | 'bodi': 7 'text': 8 'titl': 3 (1 ряд)
Код:
SELECT ts_stat('SELECT tsv from mytable');
Вот результат.
Пример вывода:
ts_stat ------------ (TITL, 1,1) (Текст, 1,1) (Води, 1,1) (3 ряда)
Предыдущая: Функции XML
Next: Функции поддержки Enum
Новый контент: Composer: менеджер зависимостей для PHP , R программирования