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

Могу ли я автоматически программировать стоп-слова с помощью полнотекстового поиска PostgreSQL?

Я использую полнотекстовый поиск PostgreSQL для проекта, в котором традиционные стоп-слова ( "a", "the", "if" и т.д.) должны быть проиндексированы и доступны для поиска, что не является поведением по умолчанию. Например, я хочу, чтобы мои пользователи находили результаты запроса "быть или не быть".

Документация указывает, что я мог бы достичь этого, создав пустой словарь словарей в $SHAREDIR/tsearch_data/english.stop (например), но это усложнит развертывание; Я хочу, чтобы настроить PostgreSQL стоп-слово обработки с SQL. Это возможно? Если да, можете ли вы предоставить образец инструкции SQL?

4b9b3361

Ответ 1

В соответствии с вашим ответом на предыдущий ответ вы можете легко переключаться между использованием без остановок слов и всех остановленных слов. Вы можете добиться этого с помощью настраиваемой конфигурации поиска:

(1) Вы можете создать пользовательский словарь без использования файла стоп-слов, например:

CREATE TEXT SEARCH DICTIONARY english_stem_nostop (
    Template = snowball
    , Language = english
);

Обратите внимание, что в приведенном выше примере я не учитывал параметр StopWords.

(2) Затем создайте новую конфигурацию, чтобы использовать новый словарь:

CREATE TEXT SEARCH CONFIGURATION public.english_nostop ( COPY = pg_catalog.english );
ALTER TEXT SEARCH CONFIGURATION public.english_nostop
   ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, hword, hword_part, word WITH english_stem_nostop;

(3) Затем при поиске укажите конфигурацию, которую вы хотите использовать (в качестве альтернативы вы можете каждый раз изменять параметр default_text_search_config), например:

SELECT
    title
FROM
    articles
WHERE
    to_tsvector('english_nostop', COALESCE(title,'') || ' ' || COALESCE(body,''))
    @@ to_tsquery('english_nostop', 'how & to');

Вы можете указать только 'english' в приведенном выше SQL, чтобы использовать обычную конфигурацию.

Примечание, в этом примере, что использование стандартной конфигурации приведет к уведомлениям, потому что есть только слова остановки.


Однако помните следующее:

  • Если вы используете индексы, для каждой конфигурации вам потребуется по два - один. (см. эти документы: таблицы tsearch и triggers).
  • Дважды проверьте, какие маркеры парсера вы хотите использовать это сопоставление в соответствии с шагом # 2 выше (см. Parsers).

Ответ 2

Нет, слова остановки могут настраиваться только через этот файл. У вас может быть функция на стороне сервера, которая изменяет файл, но для этого требуется, чтобы файл записывался: возможно, пользователь службы postgres, которого вы, вероятно, не хотите.