кодесурса
«MySQL

Функции и операторы текстового поиска PostgreSQL

script1adsense2code
script1adsense3code

Вступление

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 программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code