0
工作,我建立一個簡單的全文搜索與過濾器相結合,下面我的JUnit測試:的Lucene /休眠:@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」 是一種使嵌入我的實體的編索引字段:
@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
不是預期的,我有18個文件在我的表包括site.siteId =「新」兩個文件。
我儘量只使用一個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
任何幫助將是非常歡迎。 謝謝!