powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Полнотекстовый поиск не выдает результаты по некторым запросам
24 сообщений из 24, страница 1 из 1
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39401945
avice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, коллеги.

Впервые пробую использовать полнотекстовый поиск.

Создаю индекс для данной таблицы :
Код: sql
1.
2.
3.
4.
5.
6.
7.
ALTER TABLE models_version ADD COLUMN search_fts tsvector;

UPDATE models_version SET search_fts =
setweight( coalesce( to_tsvector('ru', name),''),'A') || ' ' ||
setweight( coalesce( to_tsvector('ru', description),''),'B');

CREATE INDEX search_fts_index ON models_version USING gin (search_fts);



Триггерная функция :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE FUNCTION models_version_vector_update() RETURNS TRIGGER AS $$
BEGIN
    IF (TG_OP = 'UPDATE') THEN
        IF ( OLD.name <> NEW.name OR OLD.description <> NEW.description) THEN
            NEW.search_fts := setweight( coalesce( to_tsvector('ru', NEW.name),''),'A') || ' ' ||
                setweight( coalesce( to_tsvector('ru', NEW.description),''),'B');
            RETURN NEW;
        ELSE
                RETURN NEW;
        END IF;
    ELSIF (TG_OP = 'INSERT') THEN
        NEW.search_fts := setweight( coalesce( to_tsvector('ru', NEW.name),''),'A') || ' ' ||
            setweight( coalesce( to_tsvector('ru', NEW.description),''),'B');
        RETURN NEW;
    END IF;
    RETURN NULL;
END;
$$ LANGUAGE 'plpgsql';

CREATE TRIGGER models_version_fts_update BEFORE INSERT OR UPDATE ON models_version
FOR EACH ROW EXECUTE PROCEDURE models_version_vector_update();



Вроде бы поиск начинает работать, но работает странно - по каким-то запросам результаты находятся, по каким-то нет.
Записи со всеми искомыми словами в таблице имеются.
К примеру, этот запрос результат выдает :

Код: sql
1.
SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('краны') ; 



А эти запросы - нет :

Код: sql
1.
2.
SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('двери') ; 
SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('окна') ; 



В поле search_fts вот такая информация хранится :

Код: sql
1.
2.
3.
4.
5.
'автоматический':2A,5B 'дверь':1A,4B 'коридор':3A,6B

'jw':1A,6B 'беринг':3A,8B 'дверь':2A,7B 'двойной':4A,9B 'экстерьер':5A,10B

'swing':2A 'top':1A 'алюминиевый':8B 'верхний':3B 'внешний':5B 'вращающийся':4B 'окно':6B 'покрытие':9B




Подскажите, в чем может быть причина такого поведения поиска?
Что я делаю не так?

Спасибо.
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39401983
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
SELECT to_tsquery('двери')
SELECT to_tsvector('двери')
SELECT to_tsvector('двери') @@ to_tsquery('двери')
SELECT ts_debug('двери')



Что выдают эти выражения?
Почему-то у ваших токенов не отброшены окончания.
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39402030
avice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запросы выдают следующее :

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT to_tsquery('двери')

'двер'


SELECT to_tsvector('двери')

'двер:1'


SELECT to_tsvector('двери') @@ to_tsquery('двери')

true


SELECT ts_debug('двери')

"(word,"Word, all letters",двери,{russian_stem},russian_stem,{двер})"
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39402071
avice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
big-trotПочему-то у ваших токенов не отброшены окончания.
Да, странно. Все пересоздал повторно - результат не изменился и у большинства токенов окончания не отбрасываются.

С чем это может быть связано?
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39402152
Rutra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У вас конфигурация 'ru' чем отличается от стандартной конфигурации 'russian'?
Еще при построении поля tsvector вы используете конфигурацию 'ru':
Код: plsql
1.
2.
3.
UPDATE models_version SET search_fts =
setweight( coalesce( to_tsvector('ru', name),''),'A') || ' ' ||
setweight( coalesce( to_tsvector('ru', description),''),'B');


А в запросе используете конфигурацию по умолчанию:
Код: plsql
1.
SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('двери'); 


Функция to_tsquery('двери') использует конфигурацию по умолчанию, которая задается GUC переменной default_text_search_config. Она возможно не 'ru'.

Что выдает запрос?
Код: plsql
1.
show default_text_search_config;
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39402191
avice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RutraУ вас конфигурация 'ru' чем отличается от стандартной конфигурации 'russian'?
Для конфигурации 'ru' добавлены внешние русский и английский словари.


RutraФункция to_tsquery('двери') использует конфигурацию по умолчанию, которая задается GUC переменной default_text_search_config. Она возможно не 'ru'.

Что выдает запрос?
Код: plsql
1.
show default_text_search_config;



Запрос выдает :
Код: sql
1.
"pg_catalog.russian"
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39402245
Rutra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуйте запросы:
Код: plsql
1.
2.
SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('двери') ; 
SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('окна') ; 
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39402247
Rutra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RutraПопробуйте запросы:
Код: plsql
1.
2.
SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('двери') ; 
SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('окна') ; 



Т.е. запросы:
Код: plsql
1.
2.
SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('ru','двери') ; 
SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('ru','окна') ; 
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39402280
avice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RutraПопробуйте запросы:

Код: plsql
1.
2.
SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('ru','двери') ; 
SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('ru','окна') ; 



Эти запросы ничего не выводят. Получается, новая созданная конфигурация 'ru' с загруженными словарями не работает (или работает некорректно)?

Попробовал все сделать для конфигурации по умолчанию - в токенах стали отбрасываться окончания и вроде как поиск начал (нормально?) работать.

Возникают вопросы :
- внешние словари - насколько они необходимы?
- причина плохой работы новой конфигурации - низкокачественные словари?
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39403035
Oleg Bartunov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
21 февраля в 19 pm ГАИШ МГУ будет проходить митап "Полнотекстовый поиск: рецепты от разработчиков.".
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39403301
Rutra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aviceЭти запросы ничего не выводят. Получается, новая созданная конфигурация 'ru' с загруженными словарями не работает (или работает некорректно)?
Странно, должны работать. Что показывает запрос?
Код: plsql
1.
SELECT to_tsvector('ru','двери'), to_tsquery('ru','двери');


tsvector и tsquery должны совпадать.
aviceПопробовал все сделать для конфигурации по умолчанию - в токенах стали отбрасываться окончания и вроде как поиск начал (нормально?) работать.

Возникают вопросы :
- внешние словари - насколько они необходимы?
- причина плохой работы новой конфигурации - низкокачественные словари?
У вас внешние словари - это словари Ispell? Откуда вы их скачали?
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39403371
cone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
avice,

> внешние словари - насколько они необходимы?
Необходимы. Без них нет смысла говорить о поиске по словоформам.

Что выдаёт запрос?
Код: sql
1.
2.
3.
4.
5.
with t(w)  as(values
    ('дверь'),('двери'),('дверью'),('дверей'),('дверям'),('дверями'),('дверьми'),('дверях'),
    ('окно'),('окна'),('окну'),('окном'),('окне'),('окон'),('окнам'),('окнами'),('окнах')
)
select w, to_tsquery(w) tsq  from t;
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39403379
cone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разумеется, интересуют результаты с вашей конфигурацией.
Код: sql
1.
to_tsquery('ru',w)
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39404067
avice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RutraСтранно, должны работать. Что показывает запрос?
Код: plsql
1.
SELECT to_tsvector('ru','двери'), to_tsquery('ru','двери');


tsvector и tsquery должны совпадать.

Совпадают : "'дверь':1";"'дверь'"

RutraУ вас внешние словари - это словари Ispell? Откуда вы их скачали?

Вроде как словари Ispell - устанавливали их так :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TEXT SEARCH DICTIONARY ispell_ru (
  template  =   ispell,
  dictfile  =   ru,
  afffile   =   ru,
  stopwords =   russian
);

CREATE TEXT SEARCH DICTIONARY ispell_en (
    template  = ispell,
    dictfile  = en,
    afffile   = en,
    stopwords = english
);



Скачивал словари отсюда и отсюда
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39404072
avice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
coneavice,
Что выдаёт запрос?
Код: sql
1.
2.
3.
4.
5.
with t(w)  as(values
    ('дверь'),('двери'),('дверью'),('дверей'),('дверям'),('дверями'),('дверьми'),('дверях'),
    ('окно'),('окна'),('окну'),('окном'),('окне'),('окон'),('окнам'),('окнами'),('окнах')
)
select w, to_tsquery('ru', w) tsq  from t;



Запрос выдает :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
"дверь";"'дверь'"
"двери";"'дверь'"
"дверью";"'дверь'"
"дверей";"'дверь'"
"дверям";"'дверь'"
"дверями";"'дверь'"
"дверьми";"'дверьми'"
"дверях";"'дверь'"
"окно";"'окно'"
"окна";"'окно'"
"окну";"'окно'"
"окном";"'окно'"
"окне";"'окно'"
"окон";"'окон'"
"окнам";"'окно'"
"окнами";"'окно'"
"окнах";"'окно'"
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39404111
avice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cone
Что выдаёт запрос?
Код: sql
1.
2.
3.
4.
5.
with t(w)  as(values
    ('дверь'),('двери'),('дверью'),('дверей'),('дверям'),('дверями'),('дверьми'),('дверях'),
    ('окно'),('окна'),('окну'),('окном'),('окне'),('окон'),('окнам'),('окнами'),('окнах')
)
select w, to_tsquery(w) tsq  from t;



А запрос без конфигурации 'ru' выдает следующее :

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
"дверь";"'двер'"
"двери";"'двер'"
"дверью";"'двер'"
"дверей";"'двер'"
"дверям";"'двер'"
"дверями";"'двер'"
"дверьми";"'дверьм'"
"дверях";"'двер'"
"окно";"'окн'"
"окна";"'окн'"
"окну";"'окн'"
"окном";"'окн'"
"окне";"'окн'"
"окон";"'окон'"
"окнам";"'окн'"
"окнами";"'окн'"
"окнах";"'окн'"
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39404127
Rutra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм... :) Все должно работать тогда для такого запроса:
Код: plsql
1.
SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('ru','двери') ;


Тогда у меня есть подозрения, что is_delete равен true для этих записей.
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39404141
avice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RutraХм... :) Все должно работать тогда для такого запроса:
Код: plsql
1.
SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('ru','двери') ;


Тогда у меня есть подозрения, что is_delete равен true для этих записей.

Оба запроса возвращают пустой результат :
Код: sql
1.
2.
SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('ru','двери') ;
SELECT id_model FROM models_version WHERE search_fts @@ to_tsquery('ru','двери') ;
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39404146
Rutra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можете скинуть dump базы в pastebin? Если дамп не слишком большой.
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39404147
avice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rutra ,

Нет, скинуть дамп не получится
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39404352
cone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Странно. Поигрался с такой табличкой.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
create table test_models_version(
    id_model    bigint  not null,
    name        text,
    description text,
    is_delete   boolean,
    search_fts  tsvector
);
alter table test_models_version  add constraint test_models_version_pk primary key (id_model);

CREATE or replace FUNCTION test_models_version_vector_update() RETURNS TRIGGER AS $$
BEGIN
    IF (TG_OP = 'UPDATE') THEN
        IF ( OLD.name <> NEW.name OR OLD.description <> NEW.description) THEN
            NEW.search_fts := setweight( coalesce( to_tsvector('russian_hunspell', NEW.name),''),'A') || ' ' ||
                setweight( coalesce( to_tsvector('russian_hunspell', NEW.description),''),'B');
            RETURN NEW;
        ELSE
                RETURN NEW;
        END IF;
    ELSIF (TG_OP = 'INSERT') THEN
        NEW.search_fts := setweight( coalesce( to_tsvector('russian_hunspell', NEW.name),''),'A') || ' ' ||
            setweight( coalesce( to_tsvector('russian_hunspell', NEW.description),''),'B');
        RETURN NEW;
    END IF;
    RETURN NULL;
END;
$$ LANGUAGE 'plpgsql';

CREATE TRIGGER test_models_version_fts_update BEFORE INSERT OR UPDATE ON test_models_version
FOR EACH ROW EXECUTE PROCEDURE test_models_version_vector_update();

insert into test_models_version(id_model,is_delete,name,description)   values
    (1,false,'дверь автоматическая коридор','дверь автоматическая коридор'),
    (2,false,'jw дверь беринг двойной экстерьер','jw дверь беринг двойной экстерьер'),
    (3,false,'top swing','верхний вращающийся внешний окно в алюминиевый покрытие')
;




Конфигурация russian_hunspell устанавливается расширением hunspell_ru_ru в версии постгреса от Postgres Professional

Запросики
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select id_model from test_models_version
where   is_delete = false
    and search_fts @@ to_tsquery('russian_hunspell','двери')
--    and search_fts @@ to_tsquery('russian','двери')
;

select id_model from test_models_version
where   is_delete = false
    and search_fts @@ to_tsquery('russian_hunspell','окна')
--    and search_fts @@ to_tsquery('russian','окна')
;


правильно отрабатывают, если конфигкрации tsvector-а и tsquery совпадают (russian_hunspell). И неправильно ищут если в tsquery использовать дефолтную russian. Во всяком случае с точностью до слова "дверьми"

Похоже:
либо каким-то образом закралось расхождение в конфигурациях, используемых для tsvector и tsquery
либо есть ещё какие-то детали, не описанные автором (например: ничего не сказано про индекс по полю search_fts).

Если дороетесь, отпишите о результатах.
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39404423
avice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cone
Конфигурация russian_hunspell устанавливается расширением hunspell_ru_ru в версии постгреса от Postgres Professional

Я никаких расширений не устанавливал, предполагая, что должно все работать без этого. Я ошибался?

coneлибо каким-то образом закралось расхождение в конфигурациях, используемых для tsvector и tsquery

Если и закралось расхождение, то даже предположить не могу где и как...

coneлибо есть ещё какие-то детали, не описанные автором (например: ничего не сказано про индекс по полю search_fts).

Про индекс по полю сказано в первом посте.
Код: sql
1.
CREATE INDEX search_fts_index ON models_version USING gin (search_fts);


Вы об этом спросили?
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39404602
cone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С индексом, конфуз. Надо добавить к макету.

aviceрасширений не устанавливал ... должно все работать без этого
конфигурации 'ru' добавлены внешние русский и английский словари
Через расширение я сделал ровно тоже: добавил русский словарь и прописал другую конфигурацию.
Одновременно подсказал желающим воспроизвести мой макет где взять этот самый словарь и как прописать конфигурацию.
Это сделано чтобы можно было воспроизвести проблему для её предметного обсуждения.
...
Рейтинг: 0 / 0
Полнотекстовый поиск не выдает результаты по некторым запросам
    #39404752
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg Bartunov21 февраля в 19 pm ГАИШ МГУ будет проходить митап "Полнотекстовый поиск: рецепты от разработчиков.".

материалы будут доступны в нтернете?
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Полнотекстовый поиск не выдает результаты по некторым запросам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]