我有一个页面来搜索具有一些标准的用户(ID,姓名,电子邮件,部门,工作) 现在我正在使用Hibernate Criteria Queries进行搜索,它的工作原理非常好。 我想知道 hibernate搜索与 lucene查询的优势,这将使我使用它,而不是使用我当前的自定义搜索。
答案 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,但这是它有助于实现的功能。