Member 10367528 Ответов: 1

Полнотекстовый поиск Postgresql


У нас есть около 20 миллионов записей в базе данных Postgresql. Один из столбцов-это html-документ, хранящийся в виде текстового типа данных. Мы хотим использовать этот столбец в функции поиска. Мы преобразовали html - контент в открытый текст и создали токены с помощью to_tsvector. Мы реализовали полнотекстовый поиск по этому столбцу токенов.

1. Когда мы ищем с одним словом и логическими операторами, он возвращает результаты, как и ожидалось. Пример:
("Jack" AND ("Jill" OR "Tom") )

2. однако, когда мы используем две или более адресных поисковых строк с логическими операторами, то это не дает ожидаемого результата. Пример: для строки поиска
("Jack Jill" OR "Jack Tom")
, он не ищет “Джек Джилл” вместе, но если он находит эти два слова в одном тексте, он возвращается. Здесь, если в столбце есть “Джек Райан Марк Джилл”, он вернет строку, но мы ожидаем, что она вернется только тогда, когда она похожа на “Джек Джилл Райан Марк”.

Не могли бы вы помочь нам решить эту проблему? Дайте нам знать, если вам понадобятся какие-либо детали с нашей стороны.

Что я уже пробовал:

SELECT * from tablename where html_tokens(column where I am storing the token)  @@ to_tsquery((ikeyword) 

1 Ответов

Рейтинг:
2

RickZeeland

Вам нужно воспользоваться бесконтактным оператором <->
Так что это будет:

"Jack <-> Jill"
Смотрите примеры здесь: Освоение инструментов PostgreSQL: полнотекстовый поиск и поиск фраз - составление статей[^]


Maciej Los

Очень интересная связанная статья!

Member 10367528

Привет Рик,

Спасибо за ваше обновление.Но я уже прошел через эту статью, но этот оператор близости <-> не работает с ИЛИ и не работает только с оператором "и"
оператор вдобавок ко всему у меня есть еще одна проблема с поиском резюме.Если одно резюме имеет
"Управление проектами" и я ищу "менеджера проектов" с оператором близости <-> резюме "Управление проектами" приходит в результате, который не является правильным.
Есть ли у вас идея, как справиться с этим типом поиска?

RickZeeland

Может быть, вы можете использовать ::tsvector вместо to_tsvector() , чтобы избавиться от "нормализации"
Смотрите объяснение здесь: https://stackoverflow.com/questions/24045475/postgres-to-tsvector-vs-tsvector

Member 10367528

Привет Рик,

Есть ли способ, чтобы мы могли позвонить, пожалуйста, для обсуждения?

RickZeeland

Боюсь, что это не очень поможет, так как я сам никогда не использовал полнотекстовый поиск в Postgres :)