[英]Hibernate search multiple entities
是否可以在多個實體中搜索相同的關鍵字,使用特定的過濾器過濾每種類型並將它們放在一個列表中?
例如,擁有實體,飼養員和動物並在其數據中搜索“波士頓梗犬”一詞。 之后,篩選出育種者的位置,並篩選出動物的物種,並返回包含動物和育種者的單個列表。
然后可以修剪此列表,以在Web應用程序的前端中分頁結果:
// FullTextQuery ftq = .... definiing and filtering the query
int numResults = ftq.getResultSize();
ftq.setFirstResult((pageNum-1)*numPerPage);
ftq.setMaxResults(numPerPage);
List<Object> results = ftq.getResultList();
假設您不關心飼養員和動物之間的關系,只想搜索動物或飼養員:是的,可以。
但是有一些條件:
Animal
類和“ Breeder
類中以完全相同的方式配置將要應用“波士頓梗”術語過濾器的字段:尤其是相同的分析器。 否則,您的搜索結果可能會不一致。 這些字段不必同時存在於兩個索引中:對“ animalName”和“ breederName”字段進行過濾應該可以正常工作。 Animal
類中不存在 。 否則,動物也將按位置進行過濾。 Breeder
類別中不得存在要用於按物種過濾動物的“物種”字段。 否則,育種者也會被物種過濾。 如果以上三個問題的答案都是“是的,我很好”,那么您可以執行以下操作:
Animal
創建一個QueryBuilder
,例如animalQueryBuilder
QueryBuilder
的Breeder
,稱breederQueryBuilder
animalQueryBuilder
作為種類過濾器。 breederQueryBuilder
作為位置過濾器 然后,在創建查詢時,將Animal類和Breeder類都傳遞給createFullTextQuery
方法。
該查詢應返回動物和飼養員。
像這樣:
QueryBuilder animalQueryBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity( Animal.class ).get();
QueryBuilder breederQueryBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity( Breeder.class ).get();
Query locationQuery = breederQueryBuilder.spatial()
.onField( "breederLocation" )
.within( 10.0, DistanceUnit.KM )
.ofLatitude( 42.0 ).andLongitude( 42.0 )
.createQuery();
Query speciesQuery = animalQueryBuilder.keyword()
.onField( "species" )
.matching( <some species> );
Query termsQuery = animalQueryBuilder.simpleQueryString()
.onFields(
"animalName", "breeder.company.legalName",
"breeder.firstName", "breeder.lastName"
)
.withAndAsDefaultOperator()
.matching( "Boston Terrier" );
Query booleanQuery = animalQueryBuilder.bool()
.must( termsQuery )
.must( animalQueryBuilder.bool()
.should( locationQuery )
.should( speciesQuery )
.createQuery()
)
.createQuery();
FullTextQuery fullTextQuery = fullTextEntityManager.createFullTextQuery( booleanQuery, Animal.class, Breeder.class );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.