Как в Postgresql реализовать поиск по первым символам каждого слова в строке?

Рейтинг: 0Ответов: 2Опубликовано: 19.07.2023

На ввод подаются строки. Например: "один". Запрос в базу должен матчить записи типа "три два один", "одиннадцатый", но не должен матчить записи типа "иван родин"

Возможно ли реализовать такое в SQL запросе? Или придется прибегать к логике кода? И может ли здесь помочь ElasticSearch?

На текущий момент поиск реализован по любому совпадению символов:

    @Query(value = "SELECT m.id, m.name FROM table m WHERE name ILIKE %:query%", nativeQuery = true)

Ответы

▲ 1Принят

Похоже, что вы хотите найти строки, которые содержат слова, начинающиеся на определенную строку.

Для этого в PostgreSQL можно использовать оператор ~ и соответствующее регулярное выражение с '\m', обозначающим начало слова`

select * from tbl where name ~ '\mодин'

В Java-коде соответственно:

@Query(value = "SELECT m.id, m.name FROM table m WHERE name ~ CONCAT('\\m', :query)", nativeQuery = true)
▲ 0

Если вы хотите искать только полные слова, а не искать их внутри других слов, можете попробовать составить свой SQL-запрос таким образом:

SELECT m.id, m.name FROM table m WHERE CONCAT(' ', name) LIKE '% :query %'

Здесь мы добавляем пробел перед значением name, и ищем пробел и :query внутри этой строки, таким образом будут искаться только полные слова.