使用 Postgresql 和 hibernate 进行全文搜索 - tsvector 和运算符 @@ 缺少类型

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 中实现此功能有什么建议吗?

Ale*_*mov 0

就我而言,我不想在所有字段中进行全文搜索。作为一个快速的工作解决方案,我添加了自定义列,搜索查询相应地运行:

@Column(name = "full_text_search_index", columnDefinition = "TEXT", nullable = false)

在本专栏中,我存储并保持搜索所需字段(某种非规范化)的一致(在实体更新上),然后搜索查询仅在“包含”之类的模式下运行。该列是索引,因此工作得很好。