use*_*020 5 postgresql full-text-search hibernate criteria-api
我有 postgresql 数据库,我想在其中使用 JPA/Hibernate 标准 API 运行全文搜索查询。我的问题是我不知道应该使用哪种类型作为 tsvector 类型以及 @@ 运算符的替代品是什么?
我创建了一个数据库视图,它组合了两个表中的数据并创建了一个连接的 tsvector:
CREATE OR REPLACE VIEW node_name_description_tags AS
SELECT nodeId, document
FROM (SELECT node.id as nodeId,
to_tsvector('english', node.name) ||
to_tsvector('english', coalesce(node.description, ' ')) ||
to_tsvector('english', coalesce(string_agg(tag.name, ' '), ' ')) as document
FROM node
JOIN tag_node ON node.id = tag_node.node_id
JOIN tag ON tag.id = tag_node.tag_id
GROUP BY nodeId) as documents
Run Code Online (Sandbox Code Playgroud)
然后我可以像这样对其运行查询,它会返回我期望的结果:
SELECT * FROM node_name_description_tags WHERE document @@ PLAINTO_TSQUERY('english', 'integration user administration file')
Run Code Online (Sandbox Code Playgroud)
我接下来要做的 - 创建映射到此视图的休眠实体,但我不知道列 tsvector 使用哪种类型。然后我打算用where子句创建一个hibernate规范,但我不知道operator @@在hibernate中是如何实现的。好像根本不支持这个功能!
我在互联网上发现人们建议使用自定义方言并添加全文搜索功能,该功能会生成 @@ where 子句。基本上,这就是我现在所拥有的一切。
关于如何在 Hibernate 中实现此功能有什么建议吗?
就我而言,我不想在所有字段中进行全文搜索。作为一个快速的工作解决方案,我添加了自定义列,搜索查询相应地运行:
@Column(name = "full_text_search_index", columnDefinition = "TEXT", nullable = false)
在本专栏中,我存储并保持搜索所需字段(某种非规范化)的一致(在实体更新上),然后搜索查询仅在“包含”之类的模式下运行。该列是索引,因此工作得很好。
| 归档时间: |
|
| 查看次数: |
2822 次 |
| 最近记录: |