Spring 搜索查询的缓存策略是什么

Spring 搜索查询的缓存策略是什么,spring,caching,solr,search-engine,strategy-pattern,Spring,Caching,Solr,Search Engine,Strategy Pattern,我们正在开发一个搜索引擎web应用程序,使用户能够搜索大约200个门户网站的内容 我们的业务合作伙伴负责维护和提供solr/lucene实例,该实例正在执行索引数据的主要工作 我们的应用程序查询solr,并以人性化的方式显示结果。但是,我们想知道如何限制查询量,也许可以使用某种形式的缓存。结果可以缓存几个小时 我们想知道的是:缓存查询结果的好策略是什么?显然,我们期望方法调用会有很大的变化。。。做缓存有意义吗 是否有一些缓存系统特别适合此用例?我们使用Spring3进行开发。最简单的解决方案是在

我们正在开发一个搜索引擎web应用程序,使用户能够搜索大约200个门户网站的内容

我们的业务合作伙伴负责维护和提供solr/lucene实例,该实例正在执行索引数据的主要工作

我们的应用程序查询solr,并以人性化的方式显示结果。但是,我们想知道如何限制查询量,也许可以使用某种形式的缓存。结果可以缓存几个小时

我们想知道的是:缓存查询结果的好策略是什么?显然,我们期望方法调用会有很大的变化。。。做缓存有意义吗


是否有一些缓存系统特别适合此用例?我们使用Spring3进行开发。

最简单的解决方案是在查询到达Solr之前对其进行改革

我创建了自己的
QueryBuilder
方法,在点击Solr之前,我会先传递查询字符串

这样做只是分解所有参数,然后将它们排序到预定义的组集中

例如,为了规范化查询以使其可缓存,可以按字母顺序对每个键进行排序,然后重新生成查询字符串,然后使用该字符串查询Solr。(实际查询结果将保持不变)

在实际运行查询之前,可以创建Solr查询字符串的散列,并检查已保存的所有密钥的内存散列。如果您发现自己接近数百万个查询键(很可能是这样),那么您可能希望开始考虑使用一种方法来减少键空间,并在缓存命中时保持一定程度的准确性

或者,您可能希望在您和Solr之间放置一个反向代理缓存。例如,如果要查询Solr,比如,
Spring->Varnish->Solr
,可以用于缓存,它将使用查询字符串作为散列。然后,您可以设置2小时过期,以便自动刷新/清除/失效结果


希望这能有所帮助

我要记住,Solr已经内置了很多缓存,以加快常见查询的速度。我建议您在使用自己的查询缓存之前,研究一下Solr/Lucene中的固有功能


是一个很好的起点。

我发现在Lucene之外缓存结果或渲染内容效果最好。拥有一个API搜索服务,该服务指向一个缓存层,其中包含来自Lucene索引的结果

如果将缓存层分离出来,则可以插入任何需要的缓存…分布式缓存(Redis、Azure AppFabric、其他云缓存等)。您还可以缓存网页的部分呈现(即ASP.NET中的outputcaching),或者使用RESTful约定缓存API调用本身。这样,缓存预热或主动缓存(基于使用情况)就很容易使用服务了


然后,您的应用程序/索引缓存可以跨应用程序的更多层“重用”,而不仅仅是索引级别的缓存。这完全取决于您的索引更新是否实时,查询是否对每个客户机/用户id等具有日期级别的安全性。如上所述,Solr已经为您做了一些这方面的工作。

好吧,这不是我的主要领域,但缓存后我们的性能有了显著提高。我们将每6到12个小时缓存一次,实际上我们使用memcached来处理它。随着时间的推移,您的缓存索引可能会变得非常大,但有了一点保留策略(即缓存-->删除中某个页面一周内没有点击),您应该能够控制所有内容。我发现,使用自定义QueryBuilder确实可以帮助规范化并缓存查询。但是你确定单词的顺序不重要吗?例如,在邻近搜索中,它确实很重要。是的,对不起,我本来打算把它包括在内,但假设它是清楚的。比如说,fq参数的顺序并不重要。因此,您必须将所有fq参数排序在一起。您必须确保其他类型分组的顺序保持一致。我认为,如果您将Solr配置为“全部”,Solr可以“全部”完成这些工作,并在索引更改时使缓存失效,这是一个额外的好处,如果您构建自己的查询缓存层,很难实现这一点。