Поиск точной части предложения в PostgreSQL - PullRequest
1 голос
/ 02 апреля 2020

У меня есть PostgreSQL таблица базы данных со строками, содержащими некоторые предложения / абзацы текста.

Допустим, есть три записи (бессмысленные, например):

1) A dancing fox ran across the road.
2) I like dancing foxtrot.
3) These animals are foxes.

Я хотел бы найти «танцующую лису» и ожидаю, что он должен возвращать только «запись 1».

Однако, когда я буду использовать подстановочный синтаксис %dancing fox% LIKE, я получу записи 1 и 2 .

Я исключил, что ts_vector может быть решением, но в проекте используется больше локалей (проблема 1), и я не хочу, чтобы он соответствовал третьей записи - мне не нужен реальный полный текст (проблема 2).

Что бы вы предложили использовать, пожалуйста? Или у вас есть опыт или ссылки на источники о том, как решать проблемы 1 и 2?

Я знаю, что мой вопрос довольно запутанный, поэтому спасибо за ваше терпение. Может быть, мне просто нужно подтолкнуть в правильном направлении.

Ответы [ 3 ]

3 голосов
/ 02 апреля 2020

Вы можете сделать это с помощью регулярного выражения.

Границы слова \y пригодятся: могут быть и другие символы, кроме пробела, разделяющего слова.

where mycol ~ '\ydancing fox\y'

Как объясняется в документации : \y соответствует только началу или концу слова .

2 голосов
/ 02 апреля 2020

Вы можете добавить разделители:

where concat(' ', col, ' ') like '% dancing fox %'
1 голос
/ 02 апреля 2020

Полнотекстовый поиск можно использовать с «простой» конфигурацией, чтобы избежать указания языка c, стоящих и останавливающих слова, и с помощью операторов соответствия фраз для поддержания порядка слов и пробелов.

select * from foo 
    where to_tsvector('simple',x)  @@ phraseto_tsquery('simple','dancing fox');

Вы говорите, что не хотите соответствовать 3-му примеру, но неясно, почему он это сделал в первую очередь, даже если вы использовали 'engli sh' и plainto_tsquery вместо 'simple' и phraseto_tsquery.

Вы все еще во власти того, что анализатор текста FTS по умолчанию считает словом, но ни один из ваших примеров не затрагивает этот вопрос (что, если fox-trot был дефис?)

Это будет поддерживаться обычными индексами FTS для типов tsvector.

Или, как рекомендует GMB, вы можете использовать ~ и '\ y'. Этот тип запроса будет поддерживаться индексами pg_trgm. Я думаю, что это решение более интуитивно понятно, но если тексты длинные, оно может быть менее эффективным.

...