10

我有一个查询正在对表的一些 11 个字符串或文本字段进行 ILIKE,该字段不大(500 000),但对于 ILIKE 显然太大,搜索查询大约需要 20 秒。数据库是 postgres 8.4

我需要更快地实现此搜索。

我想到了什么:

  1. 我从所有需要搜索的列中组装了额外的 TVECTOR 列,并在其上创建了全文索引。全文搜索非常快。但是...我无法在我的 .hbms 中映射此 TVECTOR 类型。所以这个想法落空了(无论如何,我认为它更多地是一种临时解决方案)。

  2. 休眠搜索。(今天第一次听说)这似乎很有希望,但我需要有经验的意见,因为我不想进入新的 API,可能不是最简单的,因为可以做更简单的事情。

  3. Lucene

无论如何,这个表现在已经发生了,但我希望解决方案更通用,并应用于与全文搜索相关的未来案例。

所有建议表示赞赏!

谢谢

4

6 回答 6

12

我强烈推荐 Hibernate Search,它在 Hibernate 和 Lucene 之间提供了一个非常易于使用的桥梁。请记住,您将在这里同时使用这两种方法。您只需在您希望能够搜索的域类上注释属性。然后,当您更新/插入/删除启用搜索 Hibernate Search 的实体时,只需更新相关索引。只有当发生数据库更改的事务被提交时才会发生这种情况,即如果它回滚,则索引不会被破坏。

所以回答你的问题:

  1. 是的,您可以索引特定表上的特定列。您还可以标记字段的内容,以便您可以匹配字段的某些部分。

  2. 它一点也不难使用,您只需确定要搜索的属性。告诉 Hibernate 在哪里保存它的索引。然后可以使用 EntityManager/Session 接口来加载您搜索过的实体。

于 2011-05-25T15:14:57.320 回答
6

由于您已经在使用 Hibernate 和 Lucene,Hibernate Search 是一个很好的选择。

Hibernate Search 主要提供的是一种机制,可以在数据更改时更新 Lucene 索引,并能够最大限度地利用您对 Hibernate 的了解,以简化针对 Lucene 索引的搜索。

您将能够指定要索引的每个实体中的哪些特定字段,以及根据需要添加多种类型的索引(例如,词干和全文)。您还可以设法为关联图建立索引,这样您就可以通过 Search/Lucene 进行相当复杂的查询。

我发现最好依靠 Hibernate Search 来进行文本繁重的搜索,但恢复到普通的旧 Hibernate 来进行更传统的搜索和水合复杂的对象图以显示结果。

于 2011-05-25T20:55:07.817 回答
0

一年前,我会推荐 Compass。它擅长它的工作,并且从技术上讲,在我开发和维护的应用程序中仍然可以愉快地运行。

然而,Compass 没有更多的发展,努力转向 ElasticSearch。从那个项目的网站上,我不能完全确定它是否已经为大时代做好了准备,或者甚至还活着。

所以我正在切换到 Hibernate Search,这并没有给我很好的感觉,但迁移仍处于初始阶段,所以我将保留一段时间的判断。

于 2012-02-22T16:22:03.137 回答
0

我推荐指南针。这是一个建立在 Lucene 之上的开源项目,它提供了一个更简单的 API(比 Lucene)。它很好地集成了许多常见的 Java 库和框架,例如 Spring 和 Hibernate。

于 2011-05-25T12:43:36.677 回答
0

我过去曾使用 Lucene 来索引数据库表。该解决方案效果很好,但请记住您需要维护索引。要么,每次持久化对象时更新索引,要么有一个守护进程索引器,将数据库表转储到 Lucene 索引中。

你考虑过Solr吗?它建立在 Lucene 之上,并提供来自 DB 和 Rest API 的自动索引。

于 2011-05-25T12:45:29.083 回答
0

所有项目都基于Lucene。如果你想实现一个非常高级的功能,我建议你直接使用 Lucene。如果没有,您可以使用Solr,它是 lucene 之上的强大 API,可以帮助您从 DB 中进行索引和搜索。

于 2011-05-25T15:23:05.663 回答