使用hibernate-search在嵌入式实体中强制实施多个约束

时间:2016-01-25 13:03:43

标签: java hibernate hibernate-search

我对使用hibernate-search执行查询时强制执行多个约束的可能性提出了疑问。

    @Indexed
    public class Contact{
     //ommited fields

    @IndexEmbedded
    private List<Communication> communications;

    //setters - getters

   }

以及相关的课程

    @Indexed
    public class Communication{

     @Field(analyze = Analyze.YES, store = Store.YES)
     private String value;

     @Field(analyze = Analyze.YES, store = Store.YES)
     private CommunicationType communicationType;

    @Field(analyze = Analyze.YES, store = Store.YES)
     private CommunicationUsage communicationUsage;

   }

枚举

public static enum CommunicationUsage {
  PRIVATE,
  PROFESSIONNAL
}

public static enum CommunicationType{
  PHONE,
  EMAIL
}

我需要完成的示例查询如下:

查找通信类型为“PHONE”且CommunicationUsage为“PRIVATE”的所有联系人,并且Communication类的字段值包含字符串999

    public List<Contact> search(){

     FullTextEntityManager fullTextEntityManager = 
                    Search.getFullTextEntityManager(em);


        QueryBuilder qb = fullTextEntityManager.getSearchFactory()
                .buildQueryBuilder().forEntity(Contact.class).get();

        org.apache.lucene.search.Query luceneQuery = 
         qb.bool()                    .must(qb.keyword().wildcard().onField("communications.value").matching("*99999*").createQuery())                    .must(qb.keyword().onField("communications.type").ignoreFieldBridge().matching("phone").createQuery())                    .must(qb.keyword().onField("communications.usage").ignoreFieldBridge().matching("private").createQuery())
                .createQuery();


   org.hibernate.search.jpa.FullTextQuery jpaQuery =
      fullTextEntityManager.createFullTextQuery(luceneQuery, Contact.class);

        List result = jpaQuery.getResultList();

}

但是,我的联系人的电话号码与提供的电话号码相匹配,但针对不同的通信类型和用途(例如电话和专业人员)

这样的查询是否可以通过hibernate-search完成?

1 个答案:

答案 0 :(得分:1)

目前,使用默认索引的Hibernate Search无法解决此用例。问题是Hibernate Search将要索引的所有数据(包括通过@IndexedEmbedded注释的关联)展平为单个Lucene Document。特别是在这种情况下会失去&#34;分组&#34;由单个Communication实例给出。如果您有一个Communication实例,其中包含您感兴趣的类型,另一个实例具有您感兴趣的值,那么您将获得匹配。

作为一种解决方法,您可以为Communication实例提供自定义类桥接,以某种方式连接您感兴趣的值。然后,您将尝试编写一个以此自定义字段为目标的查询。