`
javaso
  • 浏览: 52139 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JE上大牛lucene经验总结

阅读更多

 对lucene感兴趣,但没有实际有实践环境,只能根据别人的经验来总些一些现成的东西。下面是JE坛子里面大牛lucene经验。。。。

1一百万数据记录,一台服务器,分布式,前段服务器通过socket向后端lucene分布式集群发送索引数据,另后端有搜索服务器,提供lucene搜索服务。索引与搜索服务器定时同步。可提供横向扩展,多应用扩展。没有遇到问题,测试结果未定

2.第一个项目 目前是80W左右 一台服务器 Linux 8G内存 4核cpu 1T硬盘,转速中上等
版本2.4遇到的问题,在项目中直跟随服务器启动建立索引,比直接写程序建立索引生成的文件要大2-3倍暂时没解决
3.目前是400多W左右 查询速度1秒到3秒。一台普通电脑 Linux 2G内存 4核cpu 500G硬盘,转速7200
版本3.0
目前遇到的问题是建立过长的文本,会抛出数组越标,只要截取到3072字符,那就可以顺利通过索引。

4.我以前用solr,受限于服务器硬件和其他地方也要用到数据,所以将索引和数据分开的。

这里说的索引之只做index,不做store,唯一保存的是docid。(分布式还要保存score,为了合并结果时排序)

用户请求到索引这里找到相关docid(这里是排完序的docid)和相关结果总数,然后再到数据保存地方拿数据。

数据保存可以在数据库或者其他key-value的地方。

通常一个请求会返回一页数据,比如10个document,

所以为降低拿数据时引起的io问题,可以将用户请求的关键词为键,docid序列化后为值保存到memcached。(如果io还是问题突出,那么cache 高频率的document或者前几页的document)

整个过程的时间是用户请求到索引中拿到相关docid后。

如果是分布式,,那么按照最多提供页面×每个页面显示的结果数,将请求并发到不同索引处拿到docid数组,将它合并,然后排序(如果你用php,那么看下php数组函数,有去重和排序的函数直接使用)。不清楚要自己code的找下(去重,排序)

假如只做索引,无需考虑压缩。假如将数据存到数据库,那么docid其实是每条记录主键,拿数据是很快的(Sphinx通常是作索引,数据保存到mysql或者pgsql)

索引划分一般可以根据业务需要和使用频繁度来。比如用户在a版块只会查询a版块下内容,b版块只会查询b版块下内容,那么就按照a,b版块将索引划分。
使用频繁度,通常是新旧两个搜索引,新的索引一般存放当天。因为索引东西多了后,commit, optimize的时间会变得很长。不做optimize,搜索就慢。新索引只存放一天的,当然比较小,optimize的时间短。

做索引和做搜索分离:索引和搜索都很耗资源,如果能放在不同机器完成(solr的解决方案是分离),如果不能分离,那么在使用频率很低的时候做索引(一般是午夜)。

搜索结果排序,一般来说是用lucene自带的score,也有根据自己业务特点定制score的计算(我当时是自定义score)。质量好坏在于你对业务的理解和相关数据计算的正确性。
 效率:  数据量7600w,,多台服务器(实在不好意思说那叫服务器,你可以理解成是P4的pc,跑起来比PIII的品牌服务器还慢,当时很受google用普通pc的影响),,把爬虫干掉后并发不高(能扛下来我觉得挺幸运了),忘记多少了。

查询速度我记得还行好像是通常的500ms-2秒,,最慢的好像3-4秒(出现频率很低)

主要做的search优化,索引提速,重写了solr的同步shell(当时不支持freebsd,我也不会shell,拿本书花了一下午写得)。

之前是业务数据研究了下,写了score计算。当时看还行。


比较头疼的是做索引,我写shell自动完成,多个索引不同机器做,做完还要切换到search。经常要看看内存有没有out,,只有一台2g内存,其他都是1g内存,,

同步是个问题,哪怕只变化一点点,整个文件变了。

忘记索引多少G,数据存储多少G了,,依稀记得很大

5百万多数据,一台服务器 Linux 8G内存 4核cpu 硬盘转速中上等,每日pv4万
使用ehcache做缓存,使用单例模式,分了四个索引,目前运行还可以



5个G你是放在一个索引目下面?单个索引目录最好不要超过2G

把索引根据id 散列到10个索引目录下

用ParallelMultiSearcher进行搜索。

如果已经这样还是有问题,估计就是你程序写的有问题了

我现在用到时单机多RMI server,每个server都承载20G的索引。

响应时间都在1s以内,大部分100ms内就返回结果了。

服务器的配置比你好,8G + 4cpu*双核,一台服务器启动了四个JVM,一个tomcat+3个RMI Server

单个RMI Server分配的服务器资源我想跟你的应该也差不多

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics