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