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
すべてのヘルプは次のようになりますどういたしまして。 ありがとう!