使用Lucene3对数据库的多表多个字段创建索引,如何设计才能最好?

时间:2022-12-26 03:14:33
使用Lucene3来对数据库多个表中的多个字段创建全文检索,现在我的设计思路是:通过List存放所有执

行jdbcTemplate.queryForList("select t1.field1,t1.field2,t2.field1 from table1 t1,table2 t2;") 

获得的结果集合,其中List的每个元素都是一个Map,然后遍历List中的每个Map来对其中的表字段

值来创建索引,但是因为数据库中数据量会非常大,这就要充分考虑到性能问题,所以需要在必要的阶

段进行分页查询处理以分批次创建索引,但是因为是第一次使用Lucene来实现多表多字段的全文检索,

所以小弟不清楚何时进行必要的分页处理最好??,以及如何设计实现针对多表多字段的全文检索才是

最好呢???真诚希望各位牛人给予细致的指点意见,最好给出充分考虑性能的设计方案和可参考的程

序代码,小弟不胜感激!!!

5 个解决方案

#1


顶,坐等高手来解决。

#2


1)lucene是提供索引功能,也就是检索提速。用户所需要查看的数据并不是存在索引中。存储和索引需要分开。

2)根据搜索字段的需求建立所以,因为1)已经说明,索引和存储是分离的,index维护的仅仅是搜索字段

3)数据散列方式,考虑数据会存在分类,包括父分类、子分类....情况,可以使用filter来对分类进行过滤。 子分类 和 父分类 Type需要人为设计。
例如:     父分类【音乐】        子分类【儿童音乐】
正常定义: Type=3              Type=31
索引时:   Type=3              Type=3,31

这样filter 查找父分类时,子分类能被找到,以此类推。

4)分类lucene是提供了基础API的,是通过优先溢出队列来进行排序的。楼主可以去了解下这些基础的API.
大多存在于index reader模块,即reader调用的基础API

5)如果索引文件过于庞大,可以对索引文件和search进行水平切分。即切分成不同的索引模块。提供不同服务。

6)重点还是索引更新策略,这个方面多线程场景比较多,还一个就是分布式索引的结果汇总问题。







#3


如果索引文件过于庞大,可以对索引文件和search进行水平切分。即切分成不同的索引模块。提供不同服务。

#4


该回复于2010-08-03 17:55:07被版主删除

#5


引用 2 楼 moshalanye 的回复:
1)lucene是提供索引功能,也就是检索提速。用户所需要查看的数据并不是存在索引中。存储和索引需要分开。

2)根据搜索字段的需求建立所以,因为1)已经说明,索引和存储是分离的,index维护的仅仅是搜索字段

3)数据散列方式,考虑数据会存在分类,包括父分类、子分类....情况,可以使用filter来对分类进行过滤。 子分类 和 父分类 Type需要人为设计。
例如: 父分类【音乐】……

我现在想做到针对数据库表创建索引、索引文件更新及检索的功能,需要兼容一对多、多对多关系等表关系情况,表主键可能是唯一主键,也可能是联合主键;最后在检索数据时,需要根据不同的检索条件将相关表数据同行显示,现在想到了两种方案:
    一种是分别对每一个表创建索引,这样便于日后对每个表数据的索引文件进行更新及删除维护,但是查询的时候就很不方便了;
    另一种方案是对有必要同时查询的相关表联合查询后建索引,此时的索引文件中包含了多个关系表的数据,但是因为联合查询导致了关系主表数据会存在冗余,这样如果只是通过主表数据字段作为查询项来检索,而需要显示的字段也是这个主表的,最终查询的结果估计会只出现重复的主表数据,这样的结果肯定不行。不过这个可以通过结果过滤来去重;
     您觉得 这两种方案哪个更好呢 充分考虑了索引创建、更新及检索之后?给些建议吧 小弟现在打算采用联合查询建索引这种 有这方面经验的给点儿意见呗。
    例如:多对多关系表A(a_id,a2,a3)、 B(b_id,b2,b3) 关系表A_B(a_fid,b_fid) 这三张表,分别对三张表来创建索引文件,如果想根据a2来作为查询项,a2,a3,b2,b3作为显示项,那么如何在最终的查询结果中A B表的数据同行显示?
    觉得这个问题,在综合考虑索引创建、更新及检索的情况下,是分别对每个表创建索引好呢,还是将这三个表联合查询后建索引好呢?

#1


顶,坐等高手来解决。

#2


1)lucene是提供索引功能,也就是检索提速。用户所需要查看的数据并不是存在索引中。存储和索引需要分开。

2)根据搜索字段的需求建立所以,因为1)已经说明,索引和存储是分离的,index维护的仅仅是搜索字段

3)数据散列方式,考虑数据会存在分类,包括父分类、子分类....情况,可以使用filter来对分类进行过滤。 子分类 和 父分类 Type需要人为设计。
例如:     父分类【音乐】        子分类【儿童音乐】
正常定义: Type=3              Type=31
索引时:   Type=3              Type=3,31

这样filter 查找父分类时,子分类能被找到,以此类推。

4)分类lucene是提供了基础API的,是通过优先溢出队列来进行排序的。楼主可以去了解下这些基础的API.
大多存在于index reader模块,即reader调用的基础API

5)如果索引文件过于庞大,可以对索引文件和search进行水平切分。即切分成不同的索引模块。提供不同服务。

6)重点还是索引更新策略,这个方面多线程场景比较多,还一个就是分布式索引的结果汇总问题。







#3


如果索引文件过于庞大,可以对索引文件和search进行水平切分。即切分成不同的索引模块。提供不同服务。

#4


该回复于2010-08-03 17:55:07被版主删除

#5


引用 2 楼 moshalanye 的回复:
1)lucene是提供索引功能,也就是检索提速。用户所需要查看的数据并不是存在索引中。存储和索引需要分开。

2)根据搜索字段的需求建立所以,因为1)已经说明,索引和存储是分离的,index维护的仅仅是搜索字段

3)数据散列方式,考虑数据会存在分类,包括父分类、子分类....情况,可以使用filter来对分类进行过滤。 子分类 和 父分类 Type需要人为设计。
例如: 父分类【音乐】……

我现在想做到针对数据库表创建索引、索引文件更新及检索的功能,需要兼容一对多、多对多关系等表关系情况,表主键可能是唯一主键,也可能是联合主键;最后在检索数据时,需要根据不同的检索条件将相关表数据同行显示,现在想到了两种方案:
    一种是分别对每一个表创建索引,这样便于日后对每个表数据的索引文件进行更新及删除维护,但是查询的时候就很不方便了;
    另一种方案是对有必要同时查询的相关表联合查询后建索引,此时的索引文件中包含了多个关系表的数据,但是因为联合查询导致了关系主表数据会存在冗余,这样如果只是通过主表数据字段作为查询项来检索,而需要显示的字段也是这个主表的,最终查询的结果估计会只出现重复的主表数据,这样的结果肯定不行。不过这个可以通过结果过滤来去重;
     您觉得 这两种方案哪个更好呢 充分考虑了索引创建、更新及检索之后?给些建议吧 小弟现在打算采用联合查询建索引这种 有这方面经验的给点儿意见呗。
    例如:多对多关系表A(a_id,a2,a3)、 B(b_id,b2,b3) 关系表A_B(a_fid,b_fid) 这三张表,分别对三张表来创建索引文件,如果想根据a2来作为查询项,a2,a3,b2,b3作为显示项,那么如何在最终的查询结果中A B表的数据同行显示?
    觉得这个问题,在综合考虑索引创建、更新及检索的情况下,是分别对每个表创建索引好呢,还是将这三个表联合查询后建索引好呢?