首页 > 解决方案 > Postgres fulltextsearch 在一列中有多个单词

问题描述

我想在 postgres 数据库上创建全文选择查询。例如,我想查找标题为“哈利波特”的所有书籍。如果我只是通过全文搜索来查找 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))

我的错误是什么?我还需要这个全文搜索一个或多个单词的组合。

如果存在比在一个查询中组合两个单词更好的解决方案,例如

 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。

标签: postgresqlselecttsvector

解决方案


您应该使用短语搜索:

WHERE to_tsvector('simple', title) @@ to_tsquery('simple', 'harry <-> potter')

推荐阅读