[lucene] lucene关于数据库建索引
smartmac
2011-05-23
我现在要用lucene对数据库进行全文检索,然后发现大部分时间全用在了数据库的操作上,而且很慢,我首先用selec * from tablename查出所有记录,然后用这些记录建索引,发现select * from tablename这句太耗时间了,1万条数据(30个字段),查出来要二、三十秒,就算少查几个字段也要好几秒,请问lucene对数据库的检索的实现思路是什么?是先查出数据,然后对其建索引,再搜索吗?
|
|
nobody2008
2011-05-24
你访问的是测试服务器上的mySQL吧,要是是的话你在网上查查mysql反向域名解析的问题吧。
要实现数据库的索引,要先把数据从数据库中取出来,再把数据封装到不同Field中,再把field放到document中,然后就可以对document创建索引了。 也就是说先查出数据,再对其建立索引,再搜索。 前一段时间我就优化过建立索引的程序:时间主要浪费在数据库查询上,索引的建立是很快的。 优化查询吧,祝你成功。 |
|
smartmac
2011-05-24
nobody2008 写道 你访问的是测试服务器上的mySQL吧,要是是的话你在网上查查mysql反向域名解析的问题吧。
要实现数据库的索引,要先把数据从数据库中取出来,再把数据封装到不同Field中,再把field放到document中,然后就可以对document创建索引了。 也就是说先查出数据,再对其建立索引,再搜索。 前一段时间我就优化过建立索引的程序:时间主要浪费在数据库查询上,索引的建立是很快的。 优化查询吧,祝你成功。 对啊,就是从数据库取数据慢,如果是海量数据的话,要把所有数据从数据库查出来就要好长时间呢,我不知道他们是怎么处理的 |
|
smartmac
2011-05-24
对于海量数据是分段建索引?还是多线程?有大侠能指点下小弟吗?
|
|
muxiaolin
2011-05-25
selec * from tablename这样一次读取表的全部信息肯定慢,但是只有1万条就算你这样一次抓出来,也会很快,如果1W数据还慢,那就不是lucene的问题,是你数据库访问慢,或者数据库机器性能差
海量数据时,建立索引也只是分批抓取数据,mysql可以用limit,或者用id , where id > xxx and id < xxx 等等这些策略。可以多个线程抓取数据(但是效果应该根据实际情况,如果数据库很快,那可以多线程,要是性能一般,单线程就行了),然后吧数据放到 queue里,然后再用多个线程,从queue中取得数据,多个线程,可以使用一个 indexWriter,也可是使用多个indexwriter(多个indexwriter就是写到多个目录下,最后再合并),基本上100W+的短数据,5分钟计算完并优化完索引 |
|
nobody2008
2011-05-25
smartmac 写道 对于海量数据是分段建索引?还是多线程?有大侠能指点下小弟吗?
这不是靠多线程能解决的问题,主要是查询语句的优化。 给你点建议:分批查询数据,尽量少用left right join,每次查询尽可能少的连接数据库,要是mysql的话一定不要用limit。 |
|
denger
2011-05-28
nobody2008 写道 smartmac 写道 对于海量数据是分段建索引?还是多线程?有大侠能指点下小弟吗?
这不是靠多线程能解决的问题,主要是查询语句的优化。 给你点建议:分批查询数据,尽量少用left right join,每次查询尽可能少的连接数据库,要是mysql的话一定不要用limit。 是的~ 使用 left righ join 之类还好,我们有 8张表相连,数据量最多的表有 100多万,不过我们建立了视图,一次性索引处理1000条数据,主表有 20多万数据,全库建立索引大概 20多 分钟,基本上可以接受。 |
|
denger
2011-05-28
我们SQL: http://denger.iteye.com/blog/998272
|
|
gaolei33
2011-05-28
建索引和检索应该是异步的吧?不是每次检索都建索引,建索引是一次性的,对Lucene索引库检索是随时都可以的。
|