Hibernate搜索与自定义搜索

时间:2011-12-24 23:58:49

标签: hibernate design-patterns java-ee hibernate-search

我有一个页面来搜索具有一些标准的用户(ID,姓名,电子邮件,部门,工作) 现在我正在使用Hibernate Criteria Queries进行搜索,它的工作原理非常好。 我想知道 hibernate搜索 lucene查询的优势,这将使我使用它,而不是使用我当前的自定义搜索。

2 个答案:

答案 0 :(得分:3)

根据您的情况,我相信Criteria API就足够了。如果高速缓存可重复,并且您通过索引数据执行它们,那么您的Criteria API搜索可以执行良好的操作。

如果您有类型的查询,这可能就足够了:

  

给我“FooBar”部门的所有用户。

  

给我“FooBar”部门的所有用户提供作业“FooBarIst”

但是,如果您在大型非索引数据集上运行,则可能会发现性能下降。例如,如果未缓存“name”属性,则会注意到类型为

的查询
  

给我所有用户名为LIKE“Harr *”的用户   这应该给你的用户名称

Harrold 
Harrison 
Harring 
Harrelson

表现非常糟糕。

我的观点是,如果您没有为数据库引擎中的“name”属性建立索引,那么此查询将会很慢。因此,如果您计划使用此类查询,那么开始考虑使用Hibernate Search / Lucene / Solr的全文搜索解决方案已经是一个好主意。

例如,在搜索电子邮件或其他一些attrbiute并尝试制作自动完成功能时,它们会为您提供更好的性能。

所以,我给你的建议是: 根据所涉及的方案,选择是仅使用Criteria API还是Criteria API + Hibernate Search / Lucene。只要你知道它的局限性,只使用Criteria API即可。

这是第一个场景的常见查询(Criteria API就足够了,Hibernate Search + Lucene有点过分):

  

FooBarDepartment中的所有用户

以下是第二个场景的常见查询(Criteria API可以执行此操作,但Hibernate Search + Lucene将是更好的选择):

  

所有拥有以字母“f”开头的电子邮件的用户   如果所有用户的电子邮件都以字母“fOo”开头?

上述查询当然可以使用普通的Criteria API完成,但如果您有数百万用户,那么在进行此类查询时,您将开始注意到与Hibernate Search / Lucene方法相比,Hibernate Search / Lucene方法的显着性能提升。简单的标准方法。

因此,总而言之,无论您使用普通标准还是标准+ Hibernte Search + Lucene都取决于您,并且取决于要求,设计和数据。

答案 1 :(得分:0)

是的,因为baba建议您获得更好的性能,但最重要的是它提供了巨大的功能和更好的用户体验。

返回的匹配顺序将(可选)通过 related ,并且可以处理用户拼写错误,自动建议并对搜索到的术语进行文本处理(如单词相似性)。

您可以提供“google like”一个字段输入文本,智能匹配不同的字段甚至实体类型;使用Criteria或SQL实现这样的功能是一种复杂的疯狂,不会给你带来好的结果。

集成基于Lucene的自定义引擎的最佳部分是,您可以声明性地为应用程序的特定需求定制几乎所有内容;例如,您可以定义域特定的同义词,以及应用程序如何理解首字母缩略词。

在生成的索引之上,执行数据挖掘,文档相似性搜索等变得轻而易举。例如,您可以构建标记云而无需用户实际手动标记内容:您已经有了向量数据库所有术语的频率。

一个例子?这个同一个网站右侧的栏目显示“相关”问题。我不知道他们是否使用了Hibernate Search,但这是它有助于实现的功能。