【发布时间】:2014-02-07 02:23:00
【问题描述】:
我正在寻找一种方法来搜索特定表达式 - 然后是它的一部分 - 在所有文档(及其相关值)中。最终的顺序应该是:
- 完整的表达式(在标题或内容中):使用 ILIKE 和 '%expression%'
- 单词之一(在标题或内容中):在 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