-- directory paths are passed to us in environment variables
\getenv abs_srcdir PG_ABS_SRCDIR
-- -- Sanity checks for text search catalogs -- -- NB: we assume the oidjoins test will have caught any dangling links, -- that is OID or REGPROC fields that are not zero and do not match some -- row in the linked-to table. However, if we want to enforce that a link -- field can't be 0, we have to check it here.
-- Find unexpected zero link entries
SELECT oid, prsname FROM pg_ts_parser WHERE prsnamespace = 0OR prsstart = 0OR prstoken = 0OR prsend = 0OR -- prsheadline is optional
prslextype = 0;
SELECT oid, dictname FROM pg_ts_dict WHERE dictnamespace = 0OR dictowner = 0OR dicttemplate = 0;
SELECT oid, tmplname FROM pg_ts_template WHERE tmplnamespace = 0OR tmpllexize = 0; -- tmplinit is optional
SELECT oid, cfgname FROM pg_ts_config WHERE cfgnamespace = 0OR cfgowner = 0OR cfgparser = 0;
SELECT mapcfg, maptokentype, mapseqno FROM pg_ts_config_map WHERE mapcfg = 0OR mapdict = 0;
-- Look for pg_ts_config_map entries that aren't one of parser's token types SELECT * FROM
( SELECT oid AS cfgid, (ts_token_type(cfgparser)).tokid AS tokid FROM pg_ts_config ) AS tt RIGHTJOIN pg_ts_config_map AS m ON (tt.cfgid=m.mapcfg AND tt.tokid=m.maptokentype) WHERE
tt.cfgid ISNULLOR tt.tokid ISNULL;
-- Load some test data CREATETABLE test_tsvector(
t text,
a tsvector
);
\set filename :abs_srcdir '/data/tsearch.data'
COPY test_tsvector FROM :'filename';
ANALYZE test_tsvector;
-- test basic text search behavior without indexes, then with
SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D';
createindex wowidx on test_tsvector using gist (a);
SET enable_seqscan=OFF; SET enable_indexscan=ON; SET enable_bitmapscan=OFF;
explain (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D';
SET enable_indexscan=OFF; SET enable_bitmapscan=ON;
explain (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D';
-- Test siglen parameter of GiST tsvector_ops CREATEINDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(foo=1)); CREATEINDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(siglen=0)); CREATEINDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(siglen=2048)); CREATEINDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(siglen=100,foo='bar')); CREATEINDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(siglen=100, siglen = 200));
CREATEINDEX wowidx2 ON test_tsvector USING gist (a tsvector_ops(siglen=1));
\d test_tsvector
DROPINDEX wowidx;
EXPLAIN (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D';
DROPINDEX wowidx2;
CREATEINDEX wowidx ON test_tsvector USING gist (a tsvector_ops(siglen=484));
\d test_tsvector
EXPLAIN (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D';
ALTERTABLE test_tsvector SET (parallel_workers = 2); CREATEINDEX wowidx ON test_tsvector USING gin (a);
SET enable_seqscan=OFF; -- GIN only supports bitmapscan, so no need to test plain indexscan
explain (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D';
-- Test optimization of non-empty GIN_SEARCH_MODE_ALL queries EXPLAIN (COSTS OFF) SELECT count(*) FROM test_tsvector WHERE a @@ '!qh'; SELECT count(*) FROM test_tsvector WHERE a @@ '!qh';
EXPLAIN (COSTS OFF) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr'AND a @@ '!qh'; SELECT count(*) FROM test_tsvector WHERE a @@ 'wr'AND a @@ '!qh';
RESET enable_seqscan;
INSERTINTO test_tsvector VALUES ('???', 'DFG:1A,2B,6C,10 FGH'); SELECT * FROM ts_stat('SELECT a FROM test_tsvector') ORDERBY ndoc DESC, nentry DESC, word LIMIT10; SELECT * FROM ts_stat('SELECT a FROM test_tsvector', 'AB') ORDERBY ndoc DESC, nentry DESC, word;
SELECT to_tsquery('english', 'foo <-> (a <-> (the <-> bar))'); SELECT to_tsquery('english', '((foo <-> a) <-> the) <-> bar'); SELECT to_tsquery('english', 'foo <-> a <-> the <-> bar'); SELECT phraseto_tsquery('english', 'PostgreSQL can be extended by the user in many ways');
SELECT ts_rank_cd(to_tsvector('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) '), to_tsquery('english', 'paint&water'));
SELECT ts_rank_cd(to_tsvector('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) '), to_tsquery('english', 'breath&motion&water'));
SELECT ts_rank_cd(to_tsvector('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) '), to_tsquery('english', 'ocean'));
SELECT ts_rank_cd(to_tsvector('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) '), to_tsquery('english', 'painted <-> Ship'));
--headline tests SELECT ts_headline('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) ', to_tsquery('english', 'paint&water'));
SELECT ts_headline('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) ', to_tsquery('english', 'breath&motion&water'));
SELECT ts_headline('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) ', to_tsquery('english', 'ocean'));
SELECT ts_headline('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) ', to_tsquery('english', 'day & drink'));
SELECT ts_headline('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) ', to_tsquery('english', 'day | drink'));
SELECT ts_headline('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) ', to_tsquery('english', 'day | !drink'));
SELECT ts_headline('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) ', to_tsquery('english', 'painted <-> Ship & drink'));
SELECT ts_headline('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) ', to_tsquery('english', 'painted <-> Ship | drink'));
SELECT ts_headline('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) ', to_tsquery('english', 'painted <-> Ship | !drink'));
SELECT ts_headline('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) ', phraseto_tsquery('english', 'painted Ocean'));
SELECT ts_headline('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) ', phraseto_tsquery('english', 'idle as a painted Ship'));
--Check if headline fragments work SELECT ts_headline('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) ', to_tsquery('english', 'ocean'), 'MaxFragments=1');
--Check if more than one fragments are displayed SELECT ts_headline('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) ', to_tsquery('english', 'Coleridge & stuck'), 'MaxFragments=2');
--Fragments when there all query words are not in the document SELECT ts_headline('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) ', to_tsquery('english', 'ocean & seahorse'), 'MaxFragments=1');
--FragmentDelimiter option SELECT ts_headline('english', '
Day after day, day after day,
We stuck, nor breath nor motion, As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where Andall the boards did shrink;
Water, water, every where,
Nor any dropto drink.
S. T. Coleridge (1772-1834) ', to_tsquery('english', 'Coleridge & stuck'), 'MaxFragments=2,FragmentDelimiter=***');
--Fragments with phrase search SELECT ts_headline('english', 'Lorem ipsum urna. Nullam nullam ullamcorper urna.',
to_tsquery('english','Lorem') && phraseto_tsquery('english','ullamcorper urna'), 'MaxFragments=100, MaxWords=100, MinWords=1');
SELECT COUNT(*) FROM test_tsquery WHERE keyword < 'new <-> york'; SELECT COUNT(*) FROM test_tsquery WHERE keyword <= 'new <-> york'; SELECT COUNT(*) FROM test_tsquery WHERE keyword = 'new <-> york'; SELECT COUNT(*) FROM test_tsquery WHERE keyword >= 'new <-> york'; SELECT COUNT(*) FROM test_tsquery WHERE keyword > 'new <-> york';
CREATEUNIQUEINDEX bt_tsq ON test_tsquery (keyword);
SET enable_seqscan=OFF;
SELECT COUNT(*) FROM test_tsquery WHERE keyword < 'new <-> york'; SELECT COUNT(*) FROM test_tsquery WHERE keyword <= 'new <-> york'; SELECT COUNT(*) FROM test_tsquery WHERE keyword = 'new <-> york'; SELECT COUNT(*) FROM test_tsquery WHERE keyword >= 'new <-> york'; SELECT COUNT(*) FROM test_tsquery WHERE keyword > 'new <-> york';
RESET enable_seqscan;
SELECT ts_rewrite('foo & bar & qq & new & york', 'new & york'::tsquery, 'big & apple | nyc | new & york & city'); SELECT ts_rewrite(ts_rewrite('new & !york ', 'york', '!jersey'), 'jersey', 'mexico');
SELECT ts_rewrite('moscow', 'SELECT keyword, sample FROM test_tsquery'::text ); SELECT ts_rewrite('moscow & hotel', 'SELECT keyword, sample FROM test_tsquery'::text ); SELECT ts_rewrite('bar & qq & foo & (new <-> york)', 'SELECT keyword, sample FROM test_tsquery'::text );
SELECT ts_rewrite( 'moscow', 'SELECT keyword, sample FROM test_tsquery'); SELECT ts_rewrite( 'moscow & hotel', 'SELECT keyword, sample FROM test_tsquery'); SELECT ts_rewrite( 'bar & qq & foo & (new <-> york)', 'SELECT keyword, sample FROM test_tsquery');
SELECT keyword FROM test_tsquery WHERE keyword @> 'new'; SELECT keyword FROM test_tsquery WHERE keyword @> 'moscow'; SELECT keyword FROM test_tsquery WHERE keyword <@ 'new'; SELECT keyword FROM test_tsquery WHERE keyword <@ 'moscow'; SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query; SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query; SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & qq & foo & (new <-> york)') AS query; SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query; SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query; SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & qq & foo & (new <-> york)') AS query;
CREATEINDEX qq ON test_tsquery USING gist (keyword tsquery_ops); SET enable_seqscan=OFF;
SELECT keyword FROM test_tsquery WHERE keyword @> 'new'; SELECT keyword FROM test_tsquery WHERE keyword @> 'moscow'; SELECT keyword FROM test_tsquery WHERE keyword <@ 'new'; SELECT keyword FROM test_tsquery WHERE keyword <@ 'moscow'; SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query; SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query; SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & qq & foo & (new <-> york)') AS query; SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query; SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query; SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & qq & foo & (new <-> york)') AS query;
SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty'); INSERTINTO test_tsvector (t) VALUES ('345 qwerty'); SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty'); UPDATE test_tsvector SET t = nullWHERE t = '345 qwerty'; SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty');
SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty');
-- Test inlining of immutable constant functions
-- to_tsquery(text) is not immutable, so it won't be inlined explain (costs off) select * from test_tsquery, to_tsquery('new') q where txtsample @@ q;
-- to_tsquery(regconfig, text) is an immutable function. -- That allows us to get rid of using function scan and join at all. explain (costs off) select * from test_tsquery, to_tsquery('english', 'new') q where txtsample @@ q;
-- test finding items in GIN's pending list create temp table pendtest (ts tsvector); createindex pendtest_idx on pendtest using gin(ts); insertinto pendtest values (to_tsvector('Lore ipsam')); insertinto pendtest values (to_tsvector('Lore ipsum')); select * from pendtest where'ipsu:*'::tsquery @@ ts; select * from pendtest where'ipsa:*'::tsquery @@ ts; select * from pendtest where'ips:*'::tsquery @@ ts; select * from pendtest where'ipt:*'::tsquery @@ ts; select * from pendtest where'ipi:*'::tsquery @@ ts;
--check OP_PHRASE on index create temp table phrase_index_test(fts tsvector); insertinto phrase_index_test values ('A fat cat has just eaten a rat.'); insertinto phrase_index_test values (to_tsvector('english', 'A fat cat has just eaten a rat.')); createindex phrase_index_test_idx on phrase_index_test using gin(fts); set enable_seqscan = off; select * from phrase_index_test where fts @@ phraseto_tsquery('english', 'fat cat'); set enable_seqscan = on;
-- test websearch_to_tsquery function select websearch_to_tsquery('simple', 'I have a fat:*ABCD cat'); select websearch_to_tsquery('simple', 'orange:**AABBCCDD'); select websearch_to_tsquery('simple', 'fat:A!cat:B|rat:C<'); select websearch_to_tsquery('simple', 'fat:A : cat:B');
-- these operators are ignored select websearch_to_tsquery('simple', 'abc & def'); select websearch_to_tsquery('simple', 'abc | def'); select websearch_to_tsquery('simple', 'abc <-> def');
-- parens are ignored, too select websearch_to_tsquery('simple', 'abc (pg or class)'); select websearch_to_tsquery('simple', '(foo bar) or (ding dong)');
-- NOT is ignored in quotes select websearch_to_tsquery('english', 'My brand new smartphone'); select websearch_to_tsquery('english', 'My brand "new smartphone"'); select websearch_to_tsquery('english', 'My brand "new -smartphone"');
-- test OR operator select websearch_to_tsquery('simple', 'cat or rat'); select websearch_to_tsquery('simple', 'cat OR rat'); select websearch_to_tsquery('simple', 'cat "OR" rat'); select websearch_to_tsquery('simple', 'cat OR'); select websearch_to_tsquery('simple', 'OR rat'); select websearch_to_tsquery('simple', '"fat cat OR rat"'); select websearch_to_tsquery('simple', 'fat (cat OR rat'); select websearch_to_tsquery('simple', 'or OR or');
-- OR is an operator here ... select websearch_to_tsquery('simple', '"fat cat"or"fat rat"'); select websearch_to_tsquery('simple', 'fat or(rat'); select websearch_to_tsquery('simple', 'fat or)rat'); select websearch_to_tsquery('simple', 'fat or&rat'); select websearch_to_tsquery('simple', 'fat or|rat'); select websearch_to_tsquery('simple', 'fat or!rat'); select websearch_to_tsquery('simple', 'fat or<rat'); select websearch_to_tsquery('simple', 'fat or>rat'); select websearch_to_tsquery('simple', 'fat or ');
-- ... but not here select websearch_to_tsquery('simple', 'abc orange'); select websearch_to_tsquery('simple', 'abc OR1234'); select websearch_to_tsquery('simple', 'abc or-abc'); select websearch_to_tsquery('simple', 'abc OR_abc');
select websearch_to_tsquery('english', '"A fat cat" has just eaten a -rat.'); select websearch_to_tsquery('english', '"A fat cat" has just eaten OR !rat.'); select websearch_to_tsquery('english', '"A fat cat" has just (+eaten OR -rat)');
select websearch_to_tsquery('english', 'this is ----fine'); select websearch_to_tsquery('english', '(()) )))) this ||| is && -fine, "dear friend" OR good'); select websearch_to_tsquery('english', 'an old <-> cat " is fine &&& too');
select websearch_to_tsquery('english', '"A the" OR just on'); select websearch_to_tsquery('english', '"a fat cat" ate a rat');
select to_tsvector('english', 'A fat cat ate a rat') @@
websearch_to_tsquery('english', '"a fat cat" ate a rat');
select to_tsvector('english', 'A fat grey cat ate a rat') @@
websearch_to_tsquery('english', '"a fat cat" ate a rat');
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.