关于Lucene搜索、分页、排序cpu 过高问题

星辰~ 发布于 2012/02/20 08:11
阅读 2K+
收藏 1

在使用Lucene搜索时,增加了排序和多条件查询后,在一直刷新页面时,服务器cpu会100%,如下是相关代码,请高手指点下:

Sort sort2=new Sort(new SortField(null, SortField.DOC, order));//排序,order表示正序/倒序
TopFieldDocs topFieldDocs= indexSearcher.search(query, (firstIndex+pageSize),sort2);//query查询条件

加载中
0
Grrrr
Grrrr

new IndexSearcher(IndexReader.open(FSDirectory.open(indexFile)));

和我猜的一样,你这样一来每次都会打开一次index. 缓存有很多种方法,最最简单的就是系统启动的时候就生成一个searcher.弄成static的.然后用到的时候拿来就可以了. 需要对索引修改的时候直接操作.因为searcher的thread safe的.

IndexSearcher instances are completely thread safe, meaning multiple threads can call any of its methods, concurrently. If your application requires external synchronization, you should not synchronize on the IndexSearcher instance; use your own (non-Lucene) objects instead.

0
星辰~
星辰~
数据量在90W左右
0
星辰~
星辰~
有高手了解吗?有什么办法能不让cpu上去
0
Grrrr
Grrrr

不知道.没做过排序的搜索. 一般不都是按分数得出来的顺序吗?

你的indexSearcher应该缓存了吧?

星辰~
星辰~
具体业务需要按日期排序,目前已经实现,就是cpu占用率高,不知怎么优化
0
Grrrr
Grrrr

lucene研究的不是很多,我这里有一个思路:

就是在生成index的时候, 把日期也作为评分标准. 并且把分值调得高一些. 这样一来间接就排序了.........哈哈... (别拿砖拍偶......)

星辰~
星辰~
再研究研究,也是初探~
星辰~
星辰~
谢谢哟~
0
星辰~
星辰~
使用加权方式,实现了这种排序功能,比原来的效率高了很多,不过cpu还是挂
星辰~
星辰~
@Grrrr : IndexSearcher indexSearcher = new IndexSearcher(IndexReader.open(FSDirectory.open(indexFile))); TopDocs topDocs = indexSearcher.search(query, (firstIndex+pageSize));
Grrrr
Grrrr
@星辰~ : 给我看一下你生成indexSearcher的代码.
星辰~
星辰~
没有缓存,对indexSearcher怎么缓存
Grrrr
Grrrr
你的indexSearcher缓存了么?
0
Grrrr
Grrrr

大概可以判定你是因为没有缓存indexSearcher导致的. 这样一来对于每次搜索都要打开index文件.造成大量的磁盘读写操作.

星辰~
星辰~
indexSearch的缓存具体是怎么实现的,这个地方没搞明白
0
battier
battier
每次排序分页,直接读取物理文件,IO读写压力大,建议从程序角度看看,是否在第一次查询之后,放入了缓存,做缓存的思路有很多种,仅此建议
0
返回顶部
顶部