我已阅读以下内容:
http://wiki.apache.org/solr/SolrPerformanceFactors
http://wiki.apache.org/solr/SolrCaching
http://www.lucidimagination.com/content/scaling-lucene-and-solr
我对一些事情有疑问:
-XX:+UseCompressedStrings
我可以节省多少内存?举一个简单的例子,如果我有一个索引字段(字符串)和一个存储字段(字符串),omitNorms = true和omitTf = true,我可以期望在索引和文档缓存中节省多少?我估计大约有50%,但也许这太乐观了。*:*
进行自动调查吗?答案 0 :(得分:7)
6-8不肯定。
根据我自己的Solr性能调优经验,您应该让Solr处理查询,而不是文档存储。您的大多数问题都集中在文档如何占用空间。 Solr是一个搜索引擎,而不是文档存储库。如果你希望Solr是FAST并占用最少的内存,那么它应该保留的唯一内容是用于搜索目的的索引信息。应该在其他地方存储,检索和呈现文档本身。优选地,在专门针对该工作优化的系统中。您应该在Solr文档中存储的唯一字段是用于从文档存储系统中检索的ID。
答案 1 :(得分:5)
<强>缓存强>
一般来说,缓存看起来是改善性能的好主意,但这也存在很多问题:
此外,除非您的查询中存在模式,否则缓存不太可能大大提高您的搜索延迟。相反,如果您的流量的20%是由于一些查询,那么查询结果缓存可能会很有趣。配置缓存需要您非常了解您的查询和文档。如果不这样做,则应该禁用缓存。
即使你禁用了所有缓存,由于OS I / O缓存,性能仍然可以很好。实际上,这意味着如果您反复读取文件的相同部分,则可能是第一次从磁盘读取,然后从I / O缓存读取。并且禁用所有缓存允许您为JVM提供更少的内存,以便为I / O缓存提供更多内存。如果你的系统有12GB内存,如果你给JVM 2GB,这意味着I / O缓存可能能够缓存最多10G的索引(取决于其他运行需要内存的应用程序)。
我建议您阅读本文以获取有关应用程序级缓存与I / O缓存的更多信息:
https://www.varnish-cache.org/trac/wiki/ArchitectNotes
http://antirez.com/post/what-is-wrong-with-2006-programming.html
字段缓存
字符串的字段高速缓存的大小是(一个长度为maxDoc的整数数组)+(所有唯一字符串实例的一个数组)。因此,如果您的索引包含一个字符串字段,其中N个实例的平均大小为S,并且如果索引具有M个文档,则此字段的字段缓存大小约为M * 4 + N * S
。
字段缓存主要用于构面和排序。即使非常短的字符串(少于10个字符)are more than 40 bytes,这意味着如果您对具有大量唯一值的字符串字段进行排序或分面,您应该期望Solr需要大量内存。
模糊查询
FuzzyQuery is slow in Lucene 3.x, but much faster in Lucene 4.x.
这取决于您选择的拼写检查程序实现,但我认为Solr 3.x拼写检查程序使用N-Grams来查找候选项(这就是它需要专用索引的原因)然后只计算候选项上此集合的距离,所以表现仍然相当不错。