我试图了解Solr查询结果缓存是存储“完整查询结果”还是“主查询结果”。
https://teaspoon-consulting.com/articles/solr-cache-tuning.html
q = country:US&fq = state:CA。假设主查询匹配了100个文档。过滤器可处理100个文档,结果是10个文档。查询缓存将保存100个文档ID还是仅包含10个文档ID。意思是全部结果还是主要查询结果? Becoz在上面的博客中读到,查询缓存将容纳100个文档。但是查询结果缓存代码显示,结果集缓存的键也包含过滤器。希望得到确认。
我是否有任何专业知识可以确认这种行为?必须从源代码运行solr并在intellij中进行调试是一种痛苦。
答案 0 :(得分:0)
快速浏览一下,该文章令人困惑。抱歉,如果仔细阅读会发现问题。
queryResultCache不会不存储整个结果集,而是存储queryResultWindowSize(在solrconfig.xml中指定)。因此,如果您的查询与1,000,000个文档匹配,并且queryResultWindowSize为50,则此查询的缓存中仅存储50个文档ID(在您的示例中为10个)。考虑一下这是一个旨在存储几页ID的缓存,因此当用户单击“下一步”时,不必重新执行查询。
在我的示例中,在&start +&rows超过50之前,不必重新执行查询。然后,有50多个文档从&start开始在缓存中新增了一个条目。存储的文档尊重有关查询的所有内容。排序顺序,分数,fq的开始日期等。在此缓存中存储100万个文档ID是不切实际的,尤其是当您认为 exact 相同的查询很少且您认为d然后必须保留排序列表1,000,000(在我的示例中),也就是“深度分页”问题。
本文还讨论了filterCache,它确实保存了整个结果集。但是,它只是一个由maxDocs / 8界定的位集,每个满足fq子句的文档都有一个位。在我的示例中,此位集将设置1,000,000位,并且如果索引中有8M个文档,则大约为1兆字节(即maxDoc = 8,000,000)。这与queryResultCache有很大不同,因为不涉及排序,Lucene必须对每个文档进行评分。每当分数不为零时稍微翻转一下,都会使执行时间微不足道。
HTH, 埃里克