Почему этот полнотекстовый поиск 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 ответ:
Этот запрос:
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 ;
На обеих машинах. Держу пари, они разные.