6

На несколько серверов развития, этот запрос вернул ожидаемые записи:Почему этот полнотекстовый поиск 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, как это сделать.

ответ

10

Этот запрос:

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 ; 

на обеих машинах. Бетча, они разные.

+0

Бинго. Итак, ответ: укажите словарь, возвращаемый SHOW default_text_search_config; на машине dev в качестве первого аргумента plainto_tsquery(). Я обнаружил документацию в plainto_tsquery() неясно об этом; если у вас есть хорошая рекомендация, пожалуйста, поделитесь. – Kim

+1

@Kim Нет лучшего справки. Я согласен с тем, что документы могут быть более четкими. Патч был бы очень признателен ;-) –

Смежные вопросы