2014-11-02 114 views
0

下面的代码工作正常,但我需要扩展它以支持从两个类(UserEnt和BookEnt)到40个类。为了提高性能,我将允许用户选择要搜索的类,这意味着createFullTextQuery方法中的类应根据选择动态声明。这可能吗?否则,我将不得不在createFullTextQuery中声明40个类。Hibernate搜索:定义动态搜索类

// LUCENE SEARCH 
    String[] fields = {"firstName", "lastName", "name"}; 
    QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_34, 
    fields, new StandardAnalyzer(Version.LUCENE_34)); 

    org.apache.lucene.search.Query luceneQuery = null; 
    try { 
    luceneQuery = parser.parse(s); 
    } 
    catch (ParseException e) { 
     throw new RuntimeException("Unable to parse query: " + s, e); 
    } 

    // HIBERNATE SEARCH WRAP 

    FullTextEntityManager ftEm = Search.getFullTextEntityManager(em); 
    javax.persistence.Query query = ftEm.createFullTextQuery(luceneQuery, 
              UserEnt.class, BookEnt.class); 

    List <?> results = query.getResultList(); 

    System.out.println("Records found:"+results.size()); 

回答

1

createFullTextQuery(..)拍摄第一强制参数,然后一个可选可变参数参数列出你想搜索所有类型的方法。

您可以简单地省略列出那里的类型,让它定位所有已知的索引实体。

FullTextEntityManager ftEm = Search.getFullTextEntityManager(em); 
javax.persistence.Query query = ftEm.createFullTextQuery(luceneQuery); 

明确列出的类型是过滤的一种形式,但你也可以推出自己的定制FullTextFilter限制一些其它标准的结果,并仍然针对所有已知类型不需要一一列举。