请考虑以下事项:
CREATE TEMPORARY TABLE foo (string text);
INSERT INTO foo VALUES
('the small but capable man'),
('the small and strong but capable man');
SELECT * FROM foo WHERE to_tsvector(string) @@ to_tsquery('small<->but');
SELECT * FROM foo WHERE to_tsvector(string) @@ to_tsquery('small<->capable');
SELECT * FROM foo WHERE to_tsvector(string) @@ to_tsquery('small<2>capable');
第一个查询返回两个行,当它只返回一个时(因为small but
只出现一次作为完整短语)。第二个查询查询正确地不返回任何行,因为small
和capable
永远不会彼此相邻。第三个正确地只返回一个,因为small
和capable
在两个之内。
所以问题是:为什么第一个查询返回两个字符串?对于像but
(或者可能是and
等)这样的词有什么独特之处吗?
答案 0 :(得分:1)
啊,回答:默认使用english
词典,默认情况下排除停用词(and
,but
等) - 要真正匹配所有内容,我使用simple
字典,例如SELECT * FROM foo WHERE to_tsvector('simple',string) @@ to_tsquery('simple','small<->but')
。