【问题标题】:PostgreSQL 9.1: Find exact expression in titlePostgreSQL 9.1:在标题中查找精确表达式
【发布时间】:2014-02-07 02:23:00
【问题描述】:

我正在寻找一种方法来搜索特定表达式 - 然后是它的一部分 - 在所有文档(及其相关值)中。最终的顺序应该是:

  1. 完整的表达式(在标题或内容中):使用 ILIKE 和 '%expression%'
  2. 单词之一(在标题或内容中):在 tsvector 索引列上使用 tsquery

我有两张桌子:

  • 文档(id [整数]、标题 [字符变化]、title_search [tsvector])
  • 值(id [整数]、内容 [字符变化]、content_search [tsvector]、id_document [整数])

这里是我现在正在做的请求:

(SELECT id, title, content, title_search, content_search, ts_rank_cd(title_search, query) AS rank
    FROM to_tsquery('lorem&ipsum|(lorem|ipsum)') query, documents
    LEFT JOIN "values" ON id_document=id
    WHERE (title ILIKE(unaccent('%lorem ipsum%')) OR content ILIKE(unaccent('%lorem ipsum%')))) 
 UNION (SELECT id, title, content, title_search, content_search, ts_rank_cd(title_search, query) AS rank
    FROM to_tsquery('lorem&ipsum|(lorem|ipsum)') query, documents
    LEFT JOIN "values" ON id_document=id
    WHERE query @@ title_search)
 UNION (SELECT id, title, content, title_search, content_search, ts_rank_cd(title_search, query) AS rank
    FROM to_tsquery('lorem&ipsum|(lorem|ipsum)') query, documents
    LEFT JOIN "values" ON id_document=id
    WHERE query @@ content_search) 
 ORDER BY rank DESC, title ASC

通过这样做,我可以获得带有此表达式和/或其一部分的所有文档,但我无法正确排序这些文档。这是因为我依赖于 ts_rank 对 tsvector 字段的排名,它不能用于定义精确的表达式。

所以我的问题是如何让它按预期工作?使用全文搜索我错了吗?

谢谢。

【问题讨论】:

    标签: postgresql full-text-search


    【解决方案1】:

    这有点尴尬,但我之前使用的一个解决方案是在您的各个子查询中包含一个额外的“排名”列。例如,第一个查询看起来像

    select 1 as which_rank, id, title, ...
    ....
    where title ILIKE(unaccent('%lorem ipsum%'))
       OR content ILIKE(unaccent('%lorem ipsum%')))
    

    那么第二个就是

    select 2 as which_rank, id, title, ...
    ...
    where query @@ title_search
    

    第三个是

    select 3 as which_rank, id, title, ...
    ...
    where query @@ content_search
    

    如果您在排序顺序中包含该排名值:

    ORDER BY which_rank asc, rank DESC, title ASC
    

    您可以确保第一个案例排在第一位,第二个排在第二位,第三个排在第三位。您也可以根据需要重新排列 1、2、3。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多