我正在將 Hibernate Search 5 遷移到 Hibernate Search 6。盡管檔案確實很有幫助,但我無法在 Hibernate Search 6 中找到標準查詢的替代方法,也無法從檔案中獲得。
這是我要轉換的 Hibernate Search 5 查詢,
final Criteria criteria = entityManager.unwrap(Session.class).createCriteria(KnowledgeData.class);
criteria.add(Restrictions.eq("deleted", knowledgeSearchRequest.isDeleted()));
if (knowledgeSearchRequest.isPublished()) {
criteria.add(Restrictions.eq("published", knowledgeSearchRequest.isPublished()));
}
if (!allDesk) {
criteria.add(Restrictions.eq("deskId", deskId));
knowledgeSearchRequest.setDesk(deskId);
} else {
Disjunction orJunction = Restrictions.disjunction();
for (String desk : knowledgeSearchRequest.getDeskIds()) {
orJunction.add(Restrictions.eq("deskId", desk));
}
criteria.add(orJunction);
}
if (knowledgeSearchRequest.getLang() != null && knowledgeSearchRequest.getLang().size() > 0) {
criteria.createAlias("language", "lan");
Disjunction disJunction = Restrictions.disjunction();
for (String lang : knowledgeSearchRequest.getLang()) {
disJunction.add(Restrictions.eq("lan.elements", lang));
}
criteria.add(disJunction);
}
if (knowledgeSearchRequest.getTags() != null && knowledgeSearchRequest.getTags().size() > 0) {
criteria.createAlias("tags", "tag");
Disjunction disJunction = Restrictions.disjunction();
for (String tag : knowledgeSearchRequest.getTags()) {
disJunction.add(Restrictions.eq("tag.elements", tag));
}
criteria.add(disJunction);
}
criteria.add(Restrictions.ne("dataType", DataType.FOLDER));
// if (userProvider.getCurrentUser().isSystemUser() || visibleToUser) {
final List<DataVisibility> visibility = new ArrayList<>();
visibility.add(DataVisibility.PUBLIC);
if (knowledgeSearchRequest.isAddCpUserDocs()) {
visibility.add(DataVisibility.ALL_USERS_OF_CUSTOMER_PORTAL_ONLY);
}
if (knowledgeSearchRequest.isIncludeCpDocs()) {
visibility.add(DataVisibility.CUSTOMER_PORTAL);
visibility.add(DataVisibility.ALL_SIGNED_IN_USERS_OF_CUSTOMER_PORTAL_ONLY);
visibility.add(DataVisibility.ALL_USERS_OF_CUSTOMER_PORTAL_ONLY);
}
criteria.add(Restrictions.in("visibility", visibility));
// }
if (knowledgeSearchRequest.isPublished()) {
final long now = System.currentTimeMillis();
criteria.add(Restrictions.or(
Restrictions.and(Restrictions.isNotNull("validFrom"), Restrictions.lt("validFrom", now)),
Restrictions.isNull("validFrom")));
criteria.add(Restrictions.or(
Restrictions.and(Restrictions.isNotNull("validTo"), Restrictions.gt("validTo", now)),
Restrictions.isNull("validTo")));
}
而且,到目前為止我建立的謂詞是,
searchPredicateFactory.bool(
f -> f.should(searchPredicateFactory.phrase().field(KnowledgeData.STANDARD_FIELD_NAME_NAME).boost(3)
.field(KnowledgeData.STANDARD_FIELD_NAME_DISPLAY_NAME).boost(3)
.field("description").boost(2).field("content").matching(resultantQuery))
.should(searchPredicateFactory.wildcard().field(KnowledgeData.STANDARD_FIELD_NAME_NAME).boost(3)
.field(KnowledgeData.STANDARD_FIELD_NAME_DISPLAY_NAME).boost(3)
.field("description").boost(2).field("content").matching(resultantQuery))).toPredicate();
任何線索表示贊賞。
uj5u.com熱心網友回復:
這是我要轉換的 Hibernate Search 5 查詢,
我會挑剔一點:這不是 Hibernate Search 5 查詢,這是一個 Hibernate (ORM) Criteria 查詢。這些限制是針對資料庫執行的,而不是針對搜索索引。
從您的問題標題中,我假設您使用FullTextQuery.setCriteriaQuery(). 請注意,Hibernate Search 5 中的檔案宣告“應避免在 Criteria 查詢上使用限制(即 where 子句)”,而javadoc 更進一步指出“無法where定義限制”。
無論如何......它似乎曾經在 Hibernate Search 5 中作業,至少在某些情況下是這樣。
現在,要將其遷移到 Hibernate Search 6 ,有一個詳細的遷移指南,其中有一個專門針對您的問題的部分:
Hibernate Search 6 不允許將 Criteria 物件添加到搜索查詢。
[...]
如果您的目標是應用由在資料庫中執行的 SQL“where”子句表示的過濾器,則重新撰寫查詢以投影物體 ID,并在搜索查詢之后執行 JPA/Hibernate ORM 查詢以過濾物體并加載它們.
所以簡而言之,做這樣的事情:
List<Long> ids = Search.session(entityManager).search(MyEntity.class)
.select(f -> f.id(Long.class))
.where(f -> ...)
.fetchHits(20);
criteria.add(Restrictions.in("id", ids));
List<MyEntity> hits = criteria.list();
請注意,這只是一個快速修復:就像setCriteria在 Hibernate Search 5 中一樣,它的性能非常糟糕,在分頁上的表現非常糟糕,并且可能導致不正確的點擊計數。
我建議索引您在 Criteria 查詢中使用的屬性,并僅使用 Hibernate Search 定義整個查詢,以避免針對 Elasticsearch 運行查詢,然后再針對您的資料庫運行查詢。
另請參閱https://hibernate.atlassian.net/browse/HSEARCH-3630
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/483675.html
