Ihre erste Anfrage war ziemlich nah. Erstellen Sie eine Textsuchkonfiguration mit einem einfachen Wörterbuch, das dies nicht tut, um unerwünschte Stemming zu entfernen.
Ich schlage vor, ein separates Schema für Textsuchobjekte zu verwenden, aber das ist völlig optional:
CREATE SCHEMA ts;
GRANT USAGE ON SCHEMA ts TO public;
COMMENT ON SCHEMA ts IS 'text search objects';
CREATE TEXT SEARCH DICTIONARY ts.english_simple_dict (
TEMPLATE = pg_catalog.simple
, STOPWORDS = english
);
CREATE TEXT SEARCH CONFIGURATION ts.english_simple (COPY = simple);
ALTER TEXT SEARCH CONFIGURATION ts.english_simple
ALTER MAPPING FOR asciiword WITH ts.english_simple_dict; -- 1, 'Word, all ASCII'
Dann funktioniert Ihre Abfrage und auch sehr schnell:
SELECT *
FROM ts_stat($$SELECT to_tsvector('ts.english_simple', title) FROM item$$)
ORDER BY ndoc DESC
LIMIT 50;
dbfiddle hier
Dies funktioniert mit Kleinbuchstaben ohne Stemming und bricht nicht für Nicht-ASCII-Buchstaben.
Hintergrund
Lesen Sie das Kapitel Einfaches Wörterbuch im Handbuch.
Die genaue Definition eines "Wortes" ist eine schwierige Angelegenheit. Der Standard-Parser für die Textsuche (derzeit der einzige) identifiziert 23 verschiedene Arten von Token. Sehen:
SELECT * FROM ts_token_type('default');
Integrierte Textsuchkonfigurationen ordnen die meisten dieser (integrierten) Wörterbüchern zu. Zuordnungen für die english
Konfiguration:
SELECT tt.*, m.mapdict::regdictionary AS dictionary
FROM pg_ts_config_map m
LEFT JOIN ts_token_type(3722) tt ON tt.tokid = m.maptokentype
WHERE mapcfg = 'english'::regconfig -- 'ts.english_simple'::regconfig
ORDER BY tt.tokid;
Die Demo oben erstellt eine neue Konfiguration auf der Basis simple
Config, und da alle englischen Stop - Wörter des Typs ‚asciiword‘ sind, brauchen wir nur diese Art abzubilden Stoppwörter zu entfernen, nicht ergeben oder irgendetwas anderes.
ts_debug()
ist sehr teuer, da es viel Arbeit erledigt, die wir für die Abfrage nicht benötigen. Außerdem würde dies für Nicht-ASCII-Zeichen fehlschlagen. Und wir wollen wahrscheinlich auch nicht, dass zwischen Groß- und Kleinschreibung unterschieden wird. Eigentlich brauchen wir nur eine Textsuchkonfiguration, die nicht stammt. Ich habe eine andere Lösung hinzugefügt.