6

Auf mehreren Entwicklungsserver, hat diese Abfrage erwartet Datensätze zurückgegeben:Warum bricht diese PostgreSQL-Volltextsuche auf einem anderen (RDS) Server ab?

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

name_tsv ursprünglich auf meinem Dev-Server mit

UPDATE vision SET name_tsv=to_tsvector(name); 

und wird auf dem neuesten Stand mit einem Trigger bevölkert wurde.

Ich habe die gleiche Datenbank auf einer AWS PostgreSQL RDS-Instanz erstellt. Sowohl die dev- als auch die RDS-Postgres-Versionen finden Sie unter 9.3.1. Soweit ich das beurteilen kann, hat pg_catalog auf jedem die gleichen FTS-Konfigurationen, Wörterbücher, Parser und Templates (Standard; ich habe hier nichts durcheinandergebracht). Ich kann natürlich nicht auf die Datei pg conf auf der RDS-Instanz zugreifen. In dieser RDS-Instanz gibt die obige Abfrage 0 Datensätze zurück.

lief ich diese Diagnose-Abfrage auf beide:

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; 

Das Ergebnis auf der RDS-Instanz:

"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 

Das Ergebnis auf der Entwickler-Instanz:

"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 

Es aus dem obigen, dass auf RDS, to_tsvector() und playto_tsquery() scheinen beide nicht die abgeschnittene lexe zu produzieren Ich 'Squar', dass sie auf dem Dev-Server tun (das gleiche Nicht-Lexem-Muster passiert mit anderen Strings). Allerdings habe ich versucht,

UPDATE vision SET name_tsv=to_tsvector(name); 

auf dem RDS-Server ausgeführt wird, aber name_tsv änderte sich nicht (immer noch = " '1609': 1 'Park': 4 'squar': 3 'Washington': 2").

Was kann ich auf dem neuen RDS-Server tun, damit die erste Abfrage erwartete Datensätze auf die gleiche Weise wie auf meinem Dev-Server zurückgibt? Ich denke, ich muss nur noch plainto_tsquery ('Washington Square Park') normalisieren Tokens zu Lexeme (z. B. Rückkehr 'squar' nicht 'square'), aber ich kann nicht von this sagen, wie man das macht.

Antwort

10

Diese Abfrage:

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

verwendet das Standardwörterbuch. Ich würde sagen, dass das Standardwörterbuch zwischen den beiden Maschinen unterschiedlich ist. Siehe:

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) 

das Ergebnis der laufenden vergleichen:

SHOW default_text_search_config ; 

auf beiden Maschinen. Betcha, sie sind anders.

+0

Bingo. Also die Antwort ist, geben Sie das Wörterbuch von SHOW default_text_search_config; auf der Dev-Maschine als erstes Argument von plainto_tsquery(). Ich finde die Dokumentation zu plainto_tsquery() unklar; Wenn Sie eine gute Referenz haben, bitte teilen. – Kim

+1

@Kim Keine bessere Referenz zur Hand. Ich stimme zu, dass die Dokumente klarer sein könnten. Ein Patch würde sehr geschätzt werden ;-) –