Я использую полнотекстовый поиск PostgreSQL для проекта, в котором традиционные стоп-слова ( "a", "the", "if" и т.д.) должны быть проиндексированы и доступны для поиска, что не является поведением по умолчанию. Например, я хочу, чтобы мои пользователи находили результаты запроса "быть или не быть".
Могу ли я автоматически программировать стоп-слова с помощью полнотекстового поиска PostgreSQL?
Ответ 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, которого вы, вероятно, не хотите.