На несколько серверов развития, этот запрос вернул ожидаемые записи:Почему этот полнотекстовый поиск 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);
и сохраняются до настоящего времени с триггером.
Я создал ту же базу данных на экземпляре RDS AWS PostgreSQL. Обе версии 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
Результат на устр является:
"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() оба, похоже, не производят усеченный лекс me 'squar', которые они выполняют на сервере dev (тот же шаблон no-lexeme происходит с другими строками). Тем не менее, я попытался запустить
UPDATE vision SET name_tsv=to_tsvector(name);
на сервере RDS, но name_tsv не изменилась (еще = " '1609': 1 'парк': 4 'Squar': 3 '': вашингтон 2").
Что я могу сделать на новом сервере RDS, чтобы первый запрос возвращал ожидаемые записи так же, как на моем dev-сервере? Я думаю, мне просто нужно сделать plainto_tsquery («Вашингтонский квадратный парк») нормализовать токены в лексемы (например, вернуть «квадрат», а не «квадрат»), но я не могу сказать от this, как это сделать.
Бинго. Итак, ответ: укажите словарь, возвращаемый SHOW default_text_search_config; на машине dev в качестве первого аргумента plainto_tsquery(). Я обнаружил документацию в plainto_tsquery() неясно об этом; если у вас есть хорошая рекомендация, пожалуйста, поделитесь. – Kim
@Kim Нет лучшего справки. Я согласен с тем, что документы могут быть более четкими. Патч был бы очень признателен ;-) –