1:Commit和SoftCommit
Commit,硬提交,Solr和Lucene原本存在的commit方式,负责把索引内容刷入磁盘。需要重新打开searcher, Solr/Lucene才会对这部分内容可见可查,但是这样比较费性能。
并使得索引内容对Solr可见可查,该提交方式是Commit的改善方式,保证了Solr的实时性同时又兼顾了性能。
在进行softcommit过程中需要进行预热(即将现在状态的searcher复制到新的searcher中,保证了旧的softcommit
数据不丢失),虽然没有重新打开searcher那么费性能,但是预热频率过快还是会影响solr的性能。
在solrconfig.xml中可以配置自动硬提交和自动软提交
<!-硬提交->
<autoCommit>
<maxDocs>1000</maxDocs>
<maxTime>15000</maxTime>
<openSearcher>true</openSearcher>
</autoCommit>
<!-软提交->
<autoSoftCommit>
<maxTime>1000</maxTime>
</autoSoftCommit>
maxDocs:当内存索引数量达到指定值的时候,将内存的索引DUMP(转储)到硬盘中,并通知searcher类加载新的索引。
maxTime:每隔指定的时间段,自动的COMMIT内存中的索引数据,并通知Searcher类加载新的索引。
最后openSearcher配置表示进行autocommit时候是否重新打开searcher,如果autocommit频繁又将
openSearcher设置为true,那么solr的性能压力会非常大。
一般会将autocommit的maxTime和maxDocs设的相对大点,对应的softcommit的maxTime设置小点,
这样即保证了性能又保证了实时性,当然具体的值需要根据索引的频率以及document的大小综合考虑
以上两种方式,以最先达到条件执行为准。
通常是1-10分钟自动触发硬提交,每秒钟自动触发软提交
java 代码实现软硬提交
软提交:内存中
solrServer.commit(true,true,true);
//用户也可以在solr web界面查询到。只是数据内存中。
如果solr停止或者是宕机的时候数据会不会丢失?
解答:不会。
解释:在执行软提交的时候同时会有日志文件的生成,并且默认的软提交之后的15秒钟中后会执行一次flush就是硬提交。
当再次重启solr服务的时候就会实现logs日志的读取,数据就会回复。
除非你的日志文件删除了,才会有数据的丢失。
硬提交:flush到也能硬盘中
注意:
1.Solr的softCommit是Write-ahead Logging的,所以不必担心softCommit的数据会丢失。Log数据就在$solrHome/collection/data/tlog/下。
2.solr关闭时会进行一次hard commit,所以不必担心关闭时(或kill process)softCommit数据会丢失。
kill -9时数据也不会丢失,因为这些数据都会记录在tlog目录下面的日志里面,当solr重启之后就会加载日志中的数据。
除非把日志文件删掉,数据才会丢失。
2:索引字段(indexed)和存储字段(stored)
2.1将所有只用于搜索的,而不需要作为结果的field(特别是一些比较大的field)的stored设置为false(例如:copyfield字段)---就是这些字段只建立索引不存储,例如: text2.2将不需要被用于搜索的,而只是作为结果返回的field的indexed属性设置为false (这些字段不需要建立搜索,只需要作为结果返回)
2.3删除所有不必要的copyField声明(不删会对服务器性能造成压力)
3:optimize
3.1在同样没有缓存的情况下,一个没有经过优化的索引的性能会比经过优化的索引的性能少10%3.2优化的时候,会将所有的索引段合并成为一个索引段,所以,优化这个操作其实可以帮助避免“too many files”这个问题,这个错误是由文件系统抛出的。
下图:不同的索引段
优化往往能够大幅度提高查询效率,所以可以考虑周期性的优化。
http://localhost:8983/solr/collection1/update?optimize=true&waitFlush=true&wt=json把他写入一个shell脚本定时执行。
或者:SolrServer.optimize();索引优化代码
4:OutOfMemoryErrors
如果你的solr实例没有被指定足够多的内存的话,java virtual machine也许会抛outof memoryError。通过solr start -m 1g 设置jvm内存,使用solr start命令启动的时候JVM内存默认是512M
( java -Xms512m -Xmx512m -jar start.jar) 解释:初始化内存的数量何用最大内存的数量保持一致。
在这solr web界面中可以看见。5:使用主从结构实现负载均衡和提高应用的健壮性
6:把solr和应用部署在同一台服务器上(省去网络通信)7:使用尽可能高的Log输出等级,减少日志量。(默认的是比较高的等级)目的:减少日志的输出量,减少系统的压力,提高solr运行的能力,debug 模式改为error或者是其他的模式。在solr web 界面更改。