我们为Hibernate Search引入的一项创新是定义映射信息的一种替代方法:编程API。
将实体映射到Hibernate Search的传统方法是使用注解。对于95%的使用场景来说,这是完全可以接受的。然而,在某些情况下,一些人需要更动态的方法
- 他们使用元模型来生成或自定义实体中索引的内容,并需要在重新部署或根据某些上下文信息即时重新配置。
- 他们将产品发送给多个客户,这些客户需要一些定制。
人们要求的方式:XML方式(tm)
一段时间以来,有这种需求的人要求一种与注解所能完成的等效的XML格式。然而,XML的问题在于
- 它以非常冗长的方式重复了代码的结构信息
<class name="Address"> <property name="street1"> <field> <analyzer definition="ngram"/> </field> </property> <!-- ... --> </class>
- 虽然XML本身是类型安全的,但XML编辑器仍然接近史前时期,而使用记事本编写XML的开发者却很常见
- 即使XML是类型安全的,也无法对Java代码进行重构并期望在编译时获得错误或更好的自动集成重构。例如,如果我将Address重命名为Location,我仍然需要记得在XML文件中更改这一点
- 最后,动态生成XML流以应对动态重新配置用例并不是一个直观的解决方案
因此,我们选择了不同的道路。
他们得到的是什么:流畅的编程API
与其在XML中编写映射,不如在Java中编写。为了使事情更简单,让我们使用流畅的上下文API(具有直观的方法名称,仅公开相关的操作)。
SearchMapping mapping = new SearchMapping(); mapping .analyzerDef( "ngram", StandardTokenizerFactory.class ) .filter( LowerCaseFilterFactory.class ) .filter( NGramFilterFactory.class ) .param( "minGramSize", "3" ) .param( "maxGramSize", "3" ) .entity(Address.class) .indexed() .property("addressId", METHOD) .documentId() .property("street1", METHOD) .field() .field() .name("street1_ngram") .analyzer("ngram") .property("country", METHOD) .indexedEmbedded() .property("movedIn", METHOD) .dateBridge(Resolution.DAY);
正如您所看到的,这里的情况很容易理解。但在这个例子中您看不到的是,您的集成开发环境(IDE)仅根据上下文提供相关方法。例如,除非您刚刚声明了一个property()属性,否则您无法向其添加一个field()字段。同样,只有当您正在定义一个字段时,您才能在字段上设置分析器。这就像动态语言的流畅API更好;)
下一步是将程序化映射对象关联到Hibernate配置。
//in Hibernate native Configuration configuration = ...; configuration.setProperty( "hibernate.search.model_mapping", mapping ); SessionFactory factory = configuration.buildSessionFactory();
//in JPA Map<String,String> properties = new HashMap<String,String)(1); properties.put( "hibernate.search.model_mapping", mapping ); EntityManagerFactory emf = Persistence.createEntityManagerFactory( "userPU", properties );
然后,看吧!
可扩展性
这个API的优点是,对于喜欢XML的男孩来说,创建自己的XML模式描述符并使用程序化API解析XML流非常容易。更有趣的是,应用程序可以公开特定的配置选项(通过简单的配置文件、UI或任何其他形式)并使用此配置来程序化地自定义映射。
请尝试使用这个API,告诉我们哪些功能有效,哪些无效,我们还在努力使其尽可能出色:)
下载
非常感谢Amin Mohammed-Coleman接受我半成品的项目并加以完善。
您可以从这里获取Hibernate Search 3.2 Beta 1,完整API文档包含在发行版中;第4.4章。