簡體   English   中英

休眠搜索多個實體

[英]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
  • 創建另一個QueryBuilderBreeder ,稱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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM