Подтвердить что ты не робот

Конфигурация tsvector PostgreSQL: как разрешить специальные символы?

Я установил новую конфигурацию текстового поиска в PostgreSQL. В этой конфигурации используется пустой файл стоп-слова, DictFile и AffFile.

Простой тест...

SELECT * 
  FROM ts_debug('public.myconfig', 'C++ and C# and PHP');

... работает (почти) отлично, за исключением того, что лексемы для "С++" и "С#" являются "C". В принципе, все, что я хотел бы сделать, это убедиться, что lexeme для 'С++' - это 'С++', а lexeme для 'С#' - это 'С#', что позволяет пользователю запрашивать 'С++'.

4b9b3361

Ответ 1

Проблема двояка.

  • Первая проблема связана с индексацией. Конфигурация по умолчанию использует для индексирования данные, и поэтому вы получаете лексему "C" для "С++" и "С#". Вы можете использовать "простую" конфигурацию для индексации данных, но затем вы получите нежелательные слова в индексе. То, что я сделал, было конвертировать 'С++' в 'Cplusplus' и индексировать это. Так как "Cplusplus" не имеет лексемы, он будет выглядеть как есть. Вы можете сделать то же самое для "С#", сделав его "CSharp" в данных индекса.

  • Вторая проблема связана с поиском. Теперь, когда индексированные данные в порядке, нам нужно убедиться, что мы преобразуем условия поиска для специальных слов. Если пользователь вводит "С++", вам необходимо преобразовать его в "Cplusplus" перед выполнением поиска.

Я создал функцию в БД, которая взяла в строке и преобразовала все вхождения особых терминов.

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