我有一个查询,它在表的大约11个字符串或文本字段上执行ILIKE(不是很大)(500 000),但对于ILIKE显然太大,搜索查询需要20秒。数据库是postgres 8.4
我需要更快地实现此搜索。
我想到了什么:
我从需要搜索的所有列中组装了另外的TVECTOR列,并在其上创建了全文索引。全文搜索非常快。但是......我无法在我的.hbms中映射这个TVECTOR类型。所以这个想法下降了(无论如何我更多地将它作为临时解决方案)。
Hibernate搜索。 (今天第一次听到它)它看起来很有希望,但我需要经验丰富的意见,因为我不想进入新的API,可能不是最简单的一个,可以做得更简单。
Lucene的
无论如何,现在这个表已经发生了,但我希望解决方案更加通用,并应用于与全文搜索相关的未来案例。
所有建议都表示赞赏!
感谢名单
答案 0 :(得分:12)
我强烈推荐Hibernate Search,它提供了一个非常容易使用的Hibernate和Lucene之间的桥梁。记住,你将在这里使用这两个。您只需注释您希望能够搜索的域类的属性。然后,当您更新/插入/删除已启用搜索的实体时,Hibernate Search只会更新相关索引。只有在发生数据库更改的事务被提交时才会发生这种情况,即如果它被回滚,索引将不会被破坏。
所以回答你的问题:
是的,您可以索引特定表上的特定列。您还可以对字段的内容进行标记,以便您可以匹配字段的某些部分。
根本不难使用,您只需确定要搜索的属性。告诉Hibernate保存索引的位置。然后可以使用EntityManager / Session接口加载您搜索过的实体。
答案 1 :(得分:6)
由于您已经在使用Hibernate和Lucene,因此Hibernate Search是一个很好的选择。
Hibernate Search主要提供的是一种机制,可以在数据更改时更新Lucene索引,并且能够最大化您已经了解的有关Hibernate的内容,从而简化对Lucene索引的搜索。
您将能够指定要编入索引的每个实体中的特定字段,以及根据需要添加多种类型的索引(例如,词干和全文)。您还可以管理关联的索引图,以便通过Search / Lucene进行相当复杂的查询。
我发现最好依靠Hibernate Search进行文本搜索,但是要恢复普通的旧Hibernate以进行更传统的搜索,并为复杂的对象图形保持水平以便显示结果。
答案 2 :(得分:0)
我建议Compass。它是一个建立在Lucene之上的开源项目,它提供了一个更简单的API(比Lucene)。它与许多常见的Java库和框架(如Spring和Hibernate)很好地集成。
答案 3 :(得分:0)
我过去曾使用Lucene来索引数据库表。该解决方案效果很好,但请记住您需要维护索引。您可以在每次持久保存对象时更新索引,也可以使用在Lucene索引中转储数据库表的守护程序索引器。
您考虑过Solr了吗?它建立在Lucene之上,并提供来自DB和Rest API的自动索引。
答案 4 :(得分:0)
所有项目均以Lucene为基础。如果你想实现一个非常高级的功能,我建议你直接使用Lucene。如果没有,您可以使用Solr这是一个强大的API,位于lucene之上,可以帮助您从数据库进行索引和搜索。
答案 5 :(得分:0)
一年前我会推荐指南针。它擅长它的功能,并且在我开发和维护的应用程序中技术上仍然很愉快。
然而,Compass上没有更多的开发,努力已经转向ElasticSearch。从该项目的网站上我无法确定它是否已经为大时间做好准备,甚至还活着。
所以我转向Hibernate Search并没有给我那么好的感觉但是迁移仍处于初始阶段,所以我会保留一段时间的判断。