[lucene] 讨论:如何提高搜索性能?

kinghongen 2009-08-05
Lucene How To ImproveSearchingSpeed
英文网址:http://wiki.apache.org/lucene-java/ImproveSearchingSpeed
翻译后网址:http://hi.baidu.com/expertsearch/blog/item/2195a237bfe83d360a55a9fd.html


常见的搜索都是无权限的搜索,最近要做一个含权限的搜索,搜索速度问题困扰了很久。

索引格式如下:
数据1:
Title:关于中国人民银行国庆放假的通知
UserId:zhangsan|lisi|wangwu
其他域

数据2:
Title:关于中国人民银行春节放假的通知
UserId:zhaoliu|qianqi
其他域


如有1个10万数据的索引库,无权限搜索其中一个域 包含“中国人民银行”的数据有3万条,无权限搜索可以cache中存放得分最高的500条,用以下次搜索的时候提高性能。


但是当有权限的搜索时:
假设系统有1000用户,平均每个用户能搜索到30条数据

zhangsan搜索“中国人民银行”能搜索到600条数据,如果cache300条,就会造成
1000用户*300(小于等于300) = 300000(小于等于30万)


跟无权限的搜索的差异太大了,大家有好的方法吗?现在的做法是没放cache,欢迎指教。
amigobot 2009-08-08
cache某个用户特殊的搜索结果基本没有多大意义。

建议还是用不加权限的cache, 然后对cache的内容做过滤。 当然, 你需要加大cache的量, 同时cache miss的情况有可能是cache的不够多, 而不是完全miss.
kinghongen 2009-08-09
O,我再想想其他可优化的地方吧。

目前是单用户10万数据的搜索1.5秒

30到50并发的情况惨不忍睹,通过日志发现,性能瓶颈在调用lucene API搜素上
search(Query query, HitCollector results)

单用户这个方法1秒左右,30并发就到了50秒,哎难道是PC server的硬盘IO性能不好,单核处理器造成?
luckaway 2009-08-13
引用

目前是单用户10万数据的搜索1.5秒

10万数据搜索结果还是总数据?


针对每个用户缓存一点意义都没有,
你目前应该就只有两种角色:有权限和无权限,那就分开缓存各自的cache容器。
或者在key前面加个标示前缀:youquanxian_、 wuquanxian_
kinghongen 2009-08-13
是总数据10万条,由于搜索关键字解析后有点复杂(多域搜索),权限用的filter
kinghongen 2009-08-13
这是压力测试的要的标准,实际使用估计索引在50G左右
luckaway 2009-08-14
kinghongen 写道
是总数据10万条,由于搜索关键字解析后有点复杂(多域搜索),权限用的filter

不太明白你的权限的业务具体是怎么样子的!!!

就算不用缓存也不会这么慢的~~~

我现在做的搜索引擎,索引数据是20G,分布式的,2台机器并行运算的--
一个WEB服务调用多个RMI服务。



压力测试时放在一台机器(双核,3个G)上测试的,40G数据,50个并发的响应时间在2~10s之间,没加cache的。

域不是很多,就标题和正文





自己总结的,可以参考一下:
http://luckaway.iteye.com/admin/blogs/402476
Global site tag (gtag.js) - Google Analytics