Нет, там по приколу товарищи написали десятки тысяч строк кода вместе с кучей документацыи и примеров.
В документации к постгресу?
FTS вполне сносно документирован (в т.ч. на русском языке — https://postgrespro.ru/docs/postgresql/13/textsearch). А что вас интересует то? Задавайте сразу конкретный вопрос/озвучивайте проблему. Тут и разработчики FTS в чате есть, и те кто просто работает с искомым.
+
Про полнотекстовой поиск, вопросы: 1. Адекватно ли он работает для русского языка, а если нет, то как тюнить? 2. Для векторизации текстов используется единый словарь для всей базы или для каждой ячейки text векторизация строится отдельно? 3. Пригодны ли результаты векторизации для дальнейшего использования в машинном обучении?
> 1. Адекватно ли он работает для русского языка, а если нет, то как тюнить? Как мне кажется, не очень. "Тюнить" можно созданием адекватного словаря русского языка, например (и, прежде чем Вы спросите, нормальных словарей вообще нет в свободном доступе, насколько мне известно). Кроме того, это зависит от того, какой именно поиск / какая обработка Вам нужны (т.к. есть возможность создавать свои "конвейеры" для векторизации текстов). > 2. Для векторизации текстов используется единый словарь для всей базы Есть конфигурация для всей базы по умолчанию. А дальше всё зависит только от Вашей фантазии (и упорства в реализации) — можете векторизовать хоть куски полей в конкретных записях конкретных таблиц. ;) Но обычно используют единую конфигурацию для всей базы плюс, возможно, отдельные для некоторых полей некоторых таблиц. > или для каждой ячейки text векторизация строится отдельно? Вы реляционную СУБД с Excel не путаете, случайно? ;) > 3. Пригодны ли результаты векторизации Всё что угодно пригодно "для дальнейшего использования в машинном обучении", IMNSHO. Качество результата — как всегда. ;)
Спасибо за развернутый ответ!
@EshuMarabo 1. постгресПро гитхабе выкладывали адаптированные словари из OpenOffice. Они выделяют корни слов, а не отрезают "что-то похоже на окончание". 2. "Для каждой ячейки" можно, но сложно: нужно как-то понимать, по каким правилам строите поисковый запрос и вектор. Самый лобовой вариант - хранить в столбце рядом. create table test ( config text, message text ) select *, to_tsvector(config::regconfig, message), to_tsquery(config::regconfig, 'Елки & зелёные') from test config message to_tsvector to_tsquery english The Fat Rats 'fat':2 'rat':3 'ёлки' & 'зелёные' russian The Fat Rats 'fat':2 'rat':3 'ёлки' & 'зелён' english Ёлки зелёные 'зелёные':2 'ёлки':1 'ёлки' & 'зелёные' russian Ёлки зелёные 'зелён':2 'ёлки':1 'ёлки' & 'зелён' И индекс по такому запросу едва ли будет использоваться, так что либо делаем универсальный словарь на все нужные нам языки, либо делаем по запросу на каждый язык.
> адаптированные словари из OpenOffice. И словари эти (а это те, которые AOT) — дрянь, Вы меня извините. Вы сами-то с ними разбирались? > а не отрезают "что-то похоже на окончание". А тут о чём речь, кстати? Т.е. чем Вы сравниваете? > 2. "Для каждой ячейки" можно, но сложно Ну да, но тоже я имел в виду самый простой вариант, как Вы и написали: > Самый лобовой вариант - хранить в столбце рядом.
> А тут о чём речь, кстати? Т.е. чем Вы сравниваете? Со стандартными Snowball. Едва ли что-то может быть хуже них.
Ну так это просто стеммер, который пытается работать вообще без словаря (см. https://snowballstem.org/algorithms/russian/stemmer.html ), чего от него вообще можно хотеть? ;) <sarcasm>И, тем не менее, на некоторых словах даже он работает лучше, чем это "чудо" из OpenOffice.</sarcasm>
0_о а вы эти слова ещё помните? Хочется глянуть, насколько адекватно они обрабатываются лемматизатором сфинкса.
А зачем что-то помнить? Вот скачайте и посмотрите postgrespro/hunspell_dicts/master/hunspell_ru_ru_aot/ru_ru_aot.dict Вот "случайный" пример оттуда: агрегатор агрегатора агрегаторам агрегаторами агрегаторах агрегаторе агрегаторов агрегатором агрегатору агрегаторы Stemming my eye. ;(
А что в этом примере не так?
То, что основа слова агрегаторами — это агрегаторами, а вот агрегаторах — это совсем другое слово (по мнению составителей словаря).
А, понял, спасибо.
А мб кто в курсе, полнотекстовой поиск на русском в postgres pro работает лучше?
А вы не в курсе, можно ли создать словарь, пропускающий только определенные слова?
Я просто даже хз с какой стороны поступаться (
Судя по доке - создать цепочку из двух простых словарей: первый с accept = false и всеми словами в списке стоп-слов, CREATE TEXT SEARCH DICTIONARY public.simple_dict ( TEMPLATE = pg_catalog.simple, STOPWORDS = mydict ); ALTER TEXT SEARCH DICTIONARY public.simple_dict ( Accept = false ); А за ним ещё один который всё пропускает.
А можно для дебилов ссылку на документацию?(
https://postgrespro.ru/docs/postgresql/10/textsearch-dictionaries#TEXTSEARCH-SIMPLE-DICTIONARY
Обсуждают сегодня