Почему этот полнотекстовый поиск PostgreSQL прерывается на другом сервере (RDS)?


На нескольких серверах разработки этот запрос вернул ожидаемые записи:

SELECT name, name_tsv FROM vision 
WHERE name_tsv @@ plainto_tsquery('Washington Square Park');

Name_tsv изначально был заполнен на моем сервере dev с помощью

UPDATE vision SET name_tsv=to_tsvector(name);

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

Я создал такую же базу данных на экземпляре AWS PostgreSQL RDS. Обе версии dev и RDS postgres находятся на уровне 9.3.1. Насколько я могу судить, pg_catalog на каждом из них имеет одинаковые конфигурации FTS, словари, Парсеры и шаблоны (по умолчанию; я ни с чем не связывался здесь). Конечно, я не могу получить доступ к файлу PG conf на экземпляре RDS. В этом экземпляре RDS приведенный выше запрос возвращает 0 записей.

Я запустил этот диагностический запрос на обоих:

SELECT name, 
name_tsv, 
to_tsvector(name), 
plainto_tsquery('Washington Square Park'), 
name_tsv @@ plainto_tsquery('Washington Square Park') AS matches_stored_name,
to_tsvector(name) @@ plainto_tsquery('Washington Square Park') AS matches_fresh_tsvector
FROM vision WHERE id_vision = 2977;

Результат на экземпляре RDS:

"1609: Washington Square Park";"'1609':1 'park':4 'squar':3 'washington':2";"'1609':1 'park':4 'square':3 'washington':2";"'washington' & 'square' & 'park'";f;t

Результат на экземпляре dev:

"1609: Washington Square Park";"'1609':1 'park':4 'squar':3 'washington':2";"'1609':1 'park':4 'squar':3 'washington':2";"'washington' & 'squar' & 'park'";t;t

Из вышесказанного следует, что на RDS, to_tsvector () и plainto_tsquery () оба, кажется, не производят усеченную лексему 'squar', что они делают на сервере dev (тот же шаблон no-lexeme происходит с другими строками). Тем не менее, я попытался бежать

UPDATE vision SET name_tsv=to_tsvector(name);

На сервере RDS, но name_tsv не изменился (все еще = "'1609':1 'park':4 'squar': 3 'washington': 2").

Что я могу сделать на новом сервере RDS, чтобы первый запрос возвращал ожидаемые записи так же, как и на моем сервере dev? Я думаю, что мне просто нужно сделать plainto_tsquery ('Washington Square Park') нормализовать лексемы к лексемам (например, вернуть "квадрат", а не "квадрат"), но я не могу сказать из этого, как это сделать.

1 6

1 ответ:

Этот запрос:

SELECT name, name_tsv FROM vision 
WHERE name_tsv @@ plainto_tsquery('Washington Square Park');

Использует словарь по умолчанию. Я бы сказал, что словарь по умолчанию отличается между двумя машинами. Смотрите:

regress=> SELECT plainto_tsquery('Washington Square Park');
         plainto_tsquery         
---------------------------------
 'washington' & 'squar' & 'park'
(1 row)

regress=> SELECT plainto_tsquery('english', 'Washington Square Park');
         plainto_tsquery         
---------------------------------
 'washington' & 'squar' & 'park'
(1 row)

regress=> SELECT plainto_tsquery('simple', 'Washington Square Park');
         plainto_tsquery          
----------------------------------
 'washington' & 'square' & 'park'
(1 row)

Сравните результат бега:

SHOW default_text_search_config ;

На обеих машинах. Держу пари, они разные.