2016-04-25 1 views
0

で作業していない私は、私のJUnitテスト以下のフィルターと組み合わせて、簡単なフルテキスト検索を構築:のLucene/Hibernateは:@FullTextFilterDef FilterFactory

@Test 
public void D_testFilterFactory() throws Exception { 

    // get the full text entity manager 
    FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em); 

    // create the query using Hibernate Search query DSL 
    QueryBuilder queryBuilder = fullTextEntityManager 
           .getSearchFactory() 
           .buildQueryBuilder() 
           .forEntity(InspectionMaster.class) 
           .get(); 

    // Build Query ! 
    Query query = queryBuilder.keyword().wildcard().onField("itemDesc").matching("*").createQuery(); 

    FullTextQuery fullTextQuery = fullTextEntityManager.createFullTextQuery(query, InspectionMaster.class); 

    // wrap Lucene query in an Hibernate Query object 
    logService.log("TEST : Test search on itemDesc = '*' return " + fullTextQuery.getResultSize() + " documents"); 

    // test filter ! 
    fullTextQuery.enableFullTextFilter("siteFilter").setParameter("siteID", "NEW"); 
    logService.log("TEST : Test search on itemDesc = '*' with filter on site.siteId = 'NEW' return " + fullTextQuery.getResultSize() + " documents"); 

} 

私のフィルターを持つエンティティに宣言されています。

@Entity 
@Indexed 
@FullTextFilterDefs({ 
    @FullTextFilterDef(name = "siteFilter", impl = siteFilterFactory.class) 
}) 
@Table(name="LGIMAS") 
public class InspectionMaster implements Serializable { 

私もfilterFactory構築:もちろん

public class siteFilterFactory { 
    private String siteID; 

    /** 
    * injected parameter 
    */ 
    public void setSiteID(String siteID) { 
     this.siteID = siteID; 
    } 

    @Key 
    public FilterKey getKey() { 
     StandardFilterKey key = new StandardFilterKey(); 
     key.addParameter(siteID); 
     return key; 
    } 

    @Factory 
    public Filter getFilter() { 
     Query query = new TermQuery(new Term("site.siteId", siteID)); 
     return new CachingWrapperFilter(new QueryWrapperFilter(query)); 
    } 
} 

を、フィールド "site.siteIdは" embeddです私のエンティティのエド・インデックス・フィールド:

@ManyToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="SITID") 
    @IndexedEmbedded 
    private Site site; 

私がリターン次ている:何が期待されているか

*** LOG [Mon Apr 25 23:28:09 CEST 2016] TEST : Test search on itemDesc = '*' return 18 documents 
*** LOG [Mon Apr 25 23:28:09 CEST 2016] TEST : Test search on itemDesc = '*' with filter on site.siteId = 'NEW' return 0 documents 

ないが、私はsite.siteId =「NEW」を持つ2つの文書を含め、私のテーブル内の18件の文書を持っています。

私はフィルタリングなしで、唯一TermQueryを使用しよう:予想通り 公共ボイドC_testFilterは()例外{このコードで

// get the full text entity manager 
    Session hibernateSession = em.unwrap(Session.class); 
    FullTextSession fullTextSession = Search.getFullTextSession(hibernateSession); 

    BooleanQuery bq = new BooleanQuery(); 
    TermQuery filterNEW = new TermQuery(new Term("site.siteId", "NEW")); 
    bq.add(filterNEW, BooleanClause.Occur.MUST); 
    Query q = new QueryParser(Version.LUCENE_36, "cs-method", new StandardAnalyzer(Version.LUCENE_36)).parse(bq.toString()); 

    org.hibernate.Query hibernateQuery = fullTextSession.createFullTextQuery(q, InspectionMaster.class); 
    logService.log("TEST : Test filter on site.siteId = 'NEW' " + hibernateQuery.list().size() + " documents"); 

} 

すべての作業をスロー:

*** LOG [Mon Apr 25 23:42:49 CEST 2016] TEST : Test filter on site.siteId = 'NEW' 2 documents 

すべてのヘルプは次のようになりますどういたしまして。 ありがとう!

答えて

1

私は最終的にフィルターで頑張りますが、うまくいかず、なぜ私は見つからなかったのですか?同じケースでそれらのために

は、(ただし、「フィルタ」なし)シャルムのように働いて、私の完全な検索機能の下に見つける:

public Page<InspectionMaster> search(String text, String filterStatus, String filterSite, Pageable pageable) { 

     // get the full text entity manager 
     FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em); 

     // create the query using Hibernate Search query DSL 
     QueryBuilder queryBuilder = fullTextEntityManager 
            .getSearchFactory() 
            .buildQueryBuilder() 
            .forEntity(InspectionMaster.class) 
            .get(); 

     // Add wildcard to always have a full search capability 
     text = "*" + text.toLowerCase() + "*"; 

     // Prepare filter on Status and Site 
     Query filterStatusQuery; 
     if (filterStatus.isEmpty()) { 
      filterStatusQuery = queryBuilder.all().createQuery(); 
     } else { 
      filterStatusQuery = queryBuilder.keyword().onField("status").matching(StatusType.fromDescription(filterStatus)).createQuery(); 
     } 
     Query filterSiteQuery; 
     if (filterSite.isEmpty()) { 
      filterSiteQuery = queryBuilder.all().createQuery(); 
     } else { 
      filterSiteQuery = queryBuilder.keyword().onField("site.siteId").matching(filterSite).createQuery(); 
     } 

     // Prepare full text search 
     Query fullTextQuery = queryBuilder 
         .bool() 
         .should(queryBuilder.keyword().wildcard().onField("site.sitedescription").matching(text).createQuery()) 
         .should(queryBuilder.keyword().wildcard().onField("vendorNr").matching(text).createQuery()) 
         .should(queryBuilder.keyword().wildcard().onField("vendorDesc").matching(text).createQuery()) 
         .should(queryBuilder.keyword().wildcard().onField("itemNr").matching(text).createQuery()) 
         .should(queryBuilder.keyword().wildcard().onField("itemDesc").matching(text).createQuery()) 
         .should(queryBuilder.keyword().wildcard().onField("whmPickLocation").matching(text).createQuery()) 
         .createQuery(); 

     // Build final Query ! 
     Query finalQuery = queryBuilder 
        .bool() 
        .must(filterStatusQuery) 
        .must(filterSiteQuery) 
        .must(fullTextQuery) 
       .createQuery();   

     // wrap Lucene query in an Hibernate Query object 
     FullTextQuery jpaQuery = fullTextEntityManager.createFullTextQuery(finalQuery, InspectionMaster.class); 

     jpaQuery.setFirstResult(pageable.getOffset()); 
     jpaQuery.setMaxResults(pageable.getPageSize()); 

     int resultSize = jpaQuery.getResultSize(); 

     // execute search and return results (sorted by relevance as default) 
     @SuppressWarnings("unchecked") 
     List<InspectionMaster> results = jpaQuery.getResultList();  

    return new PageImpl<>(results, pageable, resultSize); 
    }  

この「3」の基準で検索を許可します

  • 1は、他のすべてのフィールド
  • 上のサイト
  • 1全文検索の地位(フィルタのような)基準
  • 1「しなければならない」の基準(第2フィルタ)「しなければなりません」

希望があれば誰か助けてください!