@Malkolm163

Как искать полнотекстовым для частей слова?

Есть таблица с названиями медицинских препаратов.
Нужно составить запрос так, чтобы он находил их более качественно.
Сейчас запрос выглядит вот так
select
    ts_rank(tsv, q) as rank,
    "PRODUCT_NAME",
    ts_headline('russian', "PRODUCT_NAME", q)
from nomenclature,
     to_tsquery('russian', 'арбидол & капс') as q,
     to_tsvector('russian',"PRODUCT_NAME") as tsv
where tsv @@ q
order by rank DESC
limit 10

Но при такой постановке, если в поиск например передать
to_tsquery('russian', 'арбидол & капс'),
то не будут найдены совпадения со словом "капсулы", если же передать
to_tsquery('russian', 'арбидол & капсулы')
то не будут найдены "капс" и т.д.
Проблема в том, что товары могут иметь названия с сокращениями или без.
Кстати та же проблема возникает например для товаров
Арбидол Максимум капс. 200мг №10
и
Арбидол Максимум капс. 200 мг №20
в одном случае 200мг без пробела, а в другом 200 мг - с пробелом.
Если пользователь забьет в поиске просто 200, то найдено будет только то, что с пробелом, т.е. не выполняется поиск по части слова.
Как сделать так чтобы это было возможно. Без дополнительного софта для поиска - только штатными средствами.
  • Вопрос задан
  • 59 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
Так как тут большое количество названий, то full text поиск скорее всего слабо подходит. Я бы попробовал pg_trgm, он очень хорошо себя показал по скорости поиска частичных слов, но это надо проверять на каждой конкретной задаче.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы