|
|
@ -97,6 +97,9 @@ public class HybridSearchService { |
|
|
* 全文关键词检索 |
|
|
* 全文关键词检索 |
|
|
* 使用 PostgreSQL tsvector 全文索引,按 ts_rank 排序。 |
|
|
* 使用 PostgreSQL tsvector 全文索引,按 ts_rank 排序。 |
|
|
* P1-2.1: 始终过滤禁用的文档(metadata->>'enabled' = 'true') |
|
|
* P1-2.1: 始终过滤禁用的文档(metadata->>'enabled' = 'true') |
|
|
|
|
|
* 注意:vector_store 为物理删除(无 is_delete 列),仅保证有 |
|
|
|
|
|
* id / content / metadata / embedding / content_tsvector / create_time 六列, |
|
|
|
|
|
* 禁止在原生 SQL 中引用 is_delete、update_time 等业务表字段。 |
|
|
*/ |
|
|
*/ |
|
|
private List<SearchResult> keywordSearch(String query, int topK, List<Long> categoryIds) { |
|
|
private List<SearchResult> keywordSearch(String query, int topK, List<Long> categoryIds) { |
|
|
String categoryFilter = buildCategoryFilter(categoryIds); |
|
|
String categoryFilter = buildCategoryFilter(categoryIds); |
|
|
@ -105,7 +108,6 @@ public class HybridSearchService { |
|
|
ts_rank(content_tsvector, plainto_tsquery('simple', ?)) AS rank |
|
|
ts_rank(content_tsvector, plainto_tsquery('simple', ?)) AS rank |
|
|
FROM vector_store |
|
|
FROM vector_store |
|
|
WHERE content_tsvector @@ plainto_tsquery('simple', ?) |
|
|
WHERE content_tsvector @@ plainto_tsquery('simple', ?) |
|
|
AND is_delete = false |
|
|
|
|
|
AND metadata->>'enabled' = 'true' |
|
|
AND metadata->>'enabled' = 'true' |
|
|
%s |
|
|
%s |
|
|
ORDER BY rank DESC |
|
|
ORDER BY rank DESC |
|
|
|