PostgreSQL 全文搜索 - 优先匹配所有术语的结果
PostgreSQL full text search - prioritizing results for results matching with all terms
您好,我想为 PostgreSQL 全文搜索定义一个查询,以便与所有术语匹配的结果排名较高,同时也检索仅与某些术语匹配的结果。
示例:
查询:tree wood
我想获得包含两个单词的更高排名的结果。但是,我也想获得仅包含 tree
或 wood
.
的结果
我尝试使用 plainto_tsquery ('tree | wood')
但这不会优先考虑包括所有查询词在内的记录。
我有一个类型为 ts_vector
的数据库列,我正在对该列进行搜索。
提前感谢您的回答。
解决方案:在使用以下内容明确按排名对结果进行排序后,我能够实现我想要的结果:
select * from table, to_tsquery('english', 'wood | tree') query where vector_column @@ query order by ts_rank_cd(search_index, query) desc;
内置排名函数 ts_rank
和 ts_rank_cd
应该会自动执行此操作。请注意,提供给排名函数的查询应该是带有 |
的查询,而不是 &
.
请注意,首先执行 &
查询可能会更快,然后仅当第一个查询未找到任何行时才执行 |
查询。但是,如果至少有一个 &
行,那么你当然不会得到任何 |
行,所以你必须决定是否可以接受。
您好,我想为 PostgreSQL 全文搜索定义一个查询,以便与所有术语匹配的结果排名较高,同时也检索仅与某些术语匹配的结果。
示例:
查询:tree wood
我想获得包含两个单词的更高排名的结果。但是,我也想获得仅包含 tree
或 wood
.
我尝试使用 plainto_tsquery ('tree | wood')
但这不会优先考虑包括所有查询词在内的记录。
我有一个类型为 ts_vector
的数据库列,我正在对该列进行搜索。
提前感谢您的回答。
解决方案:在使用以下内容明确按排名对结果进行排序后,我能够实现我想要的结果:
select * from table, to_tsquery('english', 'wood | tree') query where vector_column @@ query order by ts_rank_cd(search_index, query) desc;
内置排名函数 ts_rank
和 ts_rank_cd
应该会自动执行此操作。请注意,提供给排名函数的查询应该是带有 |
的查询,而不是 &
.
请注意,首先执行 &
查询可能会更快,然后仅当第一个查询未找到任何行时才执行 |
查询。但是,如果至少有一个 &
行,那么你当然不会得到任何 |
行,所以你必须决定是否可以接受。