java - SOLR 性能调整

标签 java solr lucene

我已阅读以下内容:

http://wiki.apache.org/solr/SolrPerformanceFactors

http://wiki.apache.org/solr/SolrCaching

http://www.lucidimagination.com/content/scaling-lucene-and-solr

我对一些事情有疑问:

  1. 如果我使用 JVM 选项 -XX:+UseCompressedStrings 我可以节省什么样的内存?举个简单的例子,如果我有 1 个索引字段(字符串)和 1 个存储字段(字符串),并且 omitNorms=true 和 omitTf=true,我可以期望在索引和文档缓存中节省多少?我猜大概是 50%,但也许这太乐观了。
  2. Solr 过滤器缓存究竟在什么时候运行?如果我只是使用 AND 和一些 OR 进行简单查询,并按分数排序,我什至需要它吗?
  3. 如果我想在文档缓存中缓存所有文档,我将如何计算所需的空间?用上面的例子,如果我有20M的文档,使用压缩字符串,存储字段的平均长度是25个字符,那么基本上需要的空间是(25字节+small_admin_overhead)* 20M吗?
  4. 如果所有文档都在文档缓存中,那么查询缓存有多重要?
  5. 如果我想将每个文档自动预热到文档缓存中,*:* 的自动预热查询会执行吗?
  6. scaling-lucene-and-solr 文章说 FuzzyQuery 很慢。如果我正在使用 solr 的拼写检查功能,那么我基本上是在正确使用模糊查询(因为拼写检查会进行相同的编辑距离计算)?所以大概拼写检查和模糊查询都同样“慢”?
  7. 描述字符串的 lucene 字段缓存的部分有点困惑。我是否正确理解所需空间基本上是索引字符串字段的大小 + 等于该字段中唯一项数的整数数组?
  8. 最后,在最大化吞吐量下,有一条关于为操作系统磁盘缓存留出足够空间的声明。它说,“总而言之,对于大规模索引,最好确保您至少有几 GB 的 RAM,超出您提供给 JVM 的内存。”。所以如果我有一台 12GB 内存的机器(作为例子),我应该给操作系统至少 2-3GB?我可以通过查看磁盘索引大小来估计操作系统所需的磁盘缓存空间吗?

最佳答案

  1. 唯一确定的方法就是尝试一下。但是,我希望索引中的节省很少,因为索引每次只包含一次实际字符串,其余部分是该字符串在文档中的位置的数据。它们在索引中所占比例不大。
  2. 过滤器缓存仅缓存过滤器查询。它可能对您的具体用例没有用,但很多人确实发现它们很有用。例如,按国家/地区、语言、产品类型等缩小结果范围。如果您经常使用 Solr,Solr 可以避免重新计算此类查询结果。
  3. 实际上,您只需要尝试一下并使用性能分析器对其进行测量即可。如果不深入了解所使用的数据结构,其他任何东西都是纯粹的 SWAG。您的计算与其他任何人的计算一样好,无需分析。
  4. 文档缓存仅在计算查询后节省构建结果的时间。如果您将大部分时间花在计算查询上,那么文档缓存对您没什么用处。查询缓存仅对重复使用的查询有用。如果你的查询都没有被重复,那么查询缓存就没用了
  5. 是的,假设您的文档缓存足够大以容纳它们。

6-8 不积极。

根据我自己的 Solr 性能调优经验,您应该让 Solr 处理查询,而不是文档存储。您的大部分问题都集中在文档如何占用空间上。 Solr 是一个搜索引擎,而不是文档存储库。如果您希望 Solr 运行速度快并占用最少的内存,那么它唯一应该保留的是用于搜索目的的索引信息。文档本身应该在别处存储、检索和呈现。最好在专门为该工作优化的系统中。您应该在 Solr 文档中存储的唯一字段是用于从文档存储系统检索的 ID。

关于java - SOLR 性能调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8627594/

相关文章:

apache - 如何修复 java IOException : Can't find resource 'solrconfig.xml' in classpath?

hadoop - HBase 索引器与 Apache HBase 一起工作

elasticsearch - Hibernate Search查询中的fullTextQuery.getResultList()出现com.google.gson.JsonArray.getAsString错误

java - 将之前写入 HDFS 的 lucene 索引加载到 RamDirectory

java - Hibernate AuditProperty 在 5.1.1.Final 中获得了新的 'alias' 参数

java - 为什么要池化无状态 session bean?

java - 如果 @RequestBody 中不存在,则 boolean 设置为 false

Java - 复制到新的 txt 文件

solr - 使用 Solr ltr(学习排名)模块时如何使用用户点击来训练模型

solr - Solr 通配符查询中的转义冒号字符