Solr应用指南
关于如何提高Solr的性能问题,可以参见Solr的官方指南:http://wiki.apache.org/solr/SolrPerformanceFactors,对于Lucene的性能问题,可以参考Lucene的官方指南:http://wiki.apache.org/lucene-java/BasicsOfPerformance。以下是本人在Solr应用中的一些小小的经验。
1.关于系统平台的选择。本人建议部署在linux系统下,JRE和Tomcat最好采用最新版本,linux也要参考网上的一些资料,对其进行优化。根据实际软硬件,优化tomcat和jvm参数,tomcat采用nio connector。
2. 建议最好采用复制模式。采用复制模式,读写分离,可以同时保证Solr的检索查询和创建索引都具有比较高的性能。复制条件可以根据需求选择commit和optimize触发复制。对于实时要求不高,可以考虑选择optimize后复制。对于作为master,一定要根据索引提交的频度,设置maxWarmingSearchers。
3.推荐使用Solr的javabin协议,以达到的更好性能,据我了解,在.net客户端中,只有本人开发的EasyNet.Solr(http://easynet.codeplex.com)支持,并且简单,容易维护和扩展。
4.对于索引更新,当原始数据比较小时,可以用定时任务去更新,一般几万条数据,包括读取数据、提交索引、优化索引,不会超过5分钟。对于大数据量的数据,可以分布式索引。对于实时性要求比较高可以通过队列服务进行处理更新。
5.本人建议不要轻易对Solr的查询解析器进行改动,最好根据需求和实际情况,放在前端处理。比如对于帮助中心,可能对于查询有些要求:需要分词、需要标题符合条件的标题优先显示等等,对于这种情况,可以做一个前端统一服务进行处理,对于用户输入词进行分词,一般是用户输入词的权重最高,然后重新构建查询,给标题也加上权重,这样检索基本就符合要求了。
6.建议开启Solr的Http Cache。我个人习惯用304,这样当索引没有变动时,直接读取缓存里面的数据。
7.不建议Solr直接用于外网服务,我会创建一个统一的检索服务层,用于服务的预处理及一些比较的逻辑处理,比如:身份验证、服务路由、分词预处理、检索调用日志、对于返回数据的复合处理等等。
8.前期对于schema的定义一定要形成规范,比如我喜欢尽可能和数据库字段名称保持一直,这样在查找问题时也很容易。需要高亮、Facet查询、前台显示需求的字段需要设置stored=true,对于需要检索要设置indexed=true。尽可能不要过多把字段设置stored=true,当数据量比较大的时候,还是比较影响性能的。