一列中有多个单词的 Postgres 全文搜索
Postgres fulltextsearch with more than one word in one column
我想在 postgres 数据库上创建全文 select 查询。
例如,我想找到所有标题为 "Harry Potter" 的书。如果我只是用全文搜索查找 Harry,它运行得很快。
例如
SELECT * FROM books WHERE to_tsvector('simple', cast(title AS text)) @@ plainto_tsquery('simple',cast('harry' AS text))
但是如果我尝试合并像哈利波特这样的标题,我的查询是 运行 超时(比如一分钟)
SELECT * FROM books WHERE to_tsvector('simple', cast(title AS text)) @@ plainto_tsquery('simple',cast('harry' AS text)) AND to_tsvector('simple', cast(title AS text)) @@ plainto_tsquery('simple',cast('potter' AS text))
我的错误是什么?我需要这个 fulltextsearch 也是 1 个或多个单词的组合。
如果有比在一个查询中组合两个词更好的解决方案,例如
SELECT * FROM books WHERE to_tsvector('simple', cast(title AS text)) @@ plainto_tsquery('simple',cast('harry potter' AS text))
编辑:发现了一些东西:
我的哈利波特的计数大约是 110.000 个数据(实际上就像书上的 1 mio 数据)。
如果我查找例如Ice Fire 数据库中只有 300 个结果,我的查询速度 运行 太快了。
也许是关于从数据库返回结果集的问题?
我实际上使用限制 100。
您应该使用词组搜索:
WHERE to_tsvector('simple', title) @@ to_tsquery('simple', 'harry <-> potter')
我想在 postgres 数据库上创建全文 select 查询。 例如,我想找到所有标题为 "Harry Potter" 的书。如果我只是用全文搜索查找 Harry,它运行得很快。 例如
SELECT * FROM books WHERE to_tsvector('simple', cast(title AS text)) @@ plainto_tsquery('simple',cast('harry' AS text))
但是如果我尝试合并像哈利波特这样的标题,我的查询是 运行 超时(比如一分钟)
SELECT * FROM books WHERE to_tsvector('simple', cast(title AS text)) @@ plainto_tsquery('simple',cast('harry' AS text)) AND to_tsvector('simple', cast(title AS text)) @@ plainto_tsquery('simple',cast('potter' AS text))
我的错误是什么?我需要这个 fulltextsearch 也是 1 个或多个单词的组合。
如果有比在一个查询中组合两个词更好的解决方案,例如
SELECT * FROM books WHERE to_tsvector('simple', cast(title AS text)) @@ plainto_tsquery('simple',cast('harry potter' AS text))
编辑:发现了一些东西: 我的哈利波特的计数大约是 110.000 个数据(实际上就像书上的 1 mio 数据)。 如果我查找例如Ice Fire 数据库中只有 300 个结果,我的查询速度 运行 太快了。 也许是关于从数据库返回结果集的问题? 我实际上使用限制 100。
您应该使用词组搜索:
WHERE to_tsvector('simple', title) @@ to_tsquery('simple', 'harry <-> potter')