【问题标题】:FULLTEXT query with scores/ranks in Postgresql在 Postgresql 中带有分数/排名的 FULLTEXT 查询
【发布时间】:2012-10-16 20:59:29
【问题描述】:

我是 Postgres 的新手,我不知道如何将此 MySQL 查询转换为 postgres:

SELECT pictures.id, MATCH (title, cached_tag_list) AGAINST ('phrase') AS score FROM pictures WHERE MATCH (title, cached_tag_list) AGAINST ('phrase') ORDER BY score DESC;

【问题讨论】:

    标签: mysql postgresql full-text-search


    【解决方案1】:

    Postgres 全文搜索与 MySQL 全文搜索略有不同。它有更多的选择,但要按照你喜欢的方式工作可能会有点困难。

    本文档告诉您如何对搜索结果进行排名,但我强烈建议您阅读手册中的整个全文部分,以了解您可以用它做什么:http://www.postgresql.org/docs/current/interactive/textsearch-controls.html#TEXTSEARCH-RANKING

    基本上,您的查询相当于:

    SELECT pictures.id, ts_rank_cd(textsearch, 'phrase') AS score
    FROM pictures
    ORDER BY score DESC
    

    如您所见,这使用了textsearch,这是您必须自己定义的东西。短版请阅读:http://www.postgresql.org/docs/current/interactive/textsearch-tables.html

    查询本质上非常简单:

    SELECT pictures.id, ts_rank_cd(to_tsvector('english', pictures.title), 'phrase') AS score
    FROM pictures
    ORDER BY score DESC
    

    但我强烈建议也添加索引:

    CREATE INDEX pictures_title ON pictures USING gin(to_tsvector('english', title));
    

    【讨论】:

    • 谢谢沃尔夫。一开始看起来很难理解,但最后我明白了。
    • 什么 textsearch?至少它不是列名。文档省略了这个细节。
    • @Timmmm:文档在这方面可能有点难以阅读。这是一个ts_vector,您可以这样创建:SELECT to_tsvector('english', 'a fat cat sat on a mat - it ate a fat rats');
    • 是的,我不知道如何获得tsvector 排名,在一个查询中按排名排序。你能做一个完整的例子吗,比如SELECT pictures.id, ts_rank_cd(tsv, query) AS score FROM pictures, to_tsquery('phase') query, (SELECT to_tsvector(pictures.title) AS tsv FROM pictures) .... Ok,这会让人感到困惑。我想要做的就是将分数作为查询中的一列,以便我可以按它进行排序和过滤。我不断收到关于列不存在或无法使用相同级别的东西的错误...也许我应该将此作为一个新问题发布。
    • 最后一个问题(对不起!)。实际上我提出了一个新问题,因为它变得相当长:Best way to use postgresql full text search with ranking?.
    猜你喜欢
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 2023-01-10
    • 1970-01-01
    相关资源
    最近更新 更多