springhibernate和postgresql全文搜索

rdrgkggo  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(319)

如何用hibernate、spring和postgresql实现fts。我可以在休眠状态下设置一些参数吗 @Formula 所以我可以 score 作为额外的选择参数:

select *,
ts_rank_cd(to_tsvector(title || ' ' || code || ' ' || line1 || ' ' || postal || ' ' || city),
                  to_tsquery('LA | Los Anageles')) AS score
from customer
where score > 0
order by score desc;

如何使用spirng规范,现在我有:

if (!StringUtils.isEmpty(search)) {
    spec = Objects.requireNonNull(spec).and((root, query, cb) -> cb.or(
            cb.like(cb.lower(root.get(Customer_.title)), "%" + search.toLowerCase() + "%"),
            cb.like(cb.lower(root.get(Customer_.code)), "%" + search.toLowerCase() + "%"),
            cb.like(cb.lower(root.get(Customer_.address).get(Address_.line1)), search.toLowerCase() + "%"),
            cb.like(cb.lower(root.get(Customer_.address).get(Address_.postal)), search.toLowerCase() + "%"),
            cb.like(cb.lower(root.get(Customer_.address).get(Address_.city)), search.toLowerCase() + "%")
    ));
}

我能不能至少使用cb.function而不按分数排序?

ego6inou

ego6inou1#

您必须实现一个自定义 SQLFunction 并在hibernate中注册一个名字。然后,您可以通过 cb.function .
或者,您还应该能够使用以下功能:

cb.function("ts_rank_cd", String.class,
  cb.function("to_tsvector", String.class, 
    cb.concat(...), 
    cb.function("to_tsquery", String.class, cb.literal("LA | Los Anageles"))
  )
).as(Double.class);

这将产生类似以下内容的sql:

cast(ts_rank_cd(to_tsvector(title || ' ' || code || ' ' || line1 || ' ' || postal || ' ' || city), to_tsquery('LA | Los Anageles')) as double precision)

相关问题