5

通常,用户进行搜索,获取命中列表,然后可以浏览它。命中列表是在整个浏览过程中保持一致的中间结果,通常存储在会话状态中。例如,如果新项目被其他人同时添加,它们只会出现在随后的搜索中。

在 REST 应用程序中,我不能轻易获得这个中间结果——它既不属于客户端,也不属于模型。我已经阅读了 REST web app 中的分页,但对答案并不完全清楚。那里的解决方案似乎假设在用户浏览结果时模型没有更新。

我们当然可以把世界(模型)想象成一系列不可变的快照。通过提供时间戳(或全局版本号),我们就可以得到当时模型的一致视图,概念上解决问题。然而,它确实意味着模型的完整版本。(我也想知道是否与函数式编程有联系)

我应该如何处理这个问题?

注意:我问是因为我打算使用play framework,它根本没有 HTTP 状态或会话的概念;这是纯粹的宁静。

4

2 回答 2

5

在您获得第一次搜索的查询结果后,您可以将结果保存在缓存中。对于一台服务器,它可以是 ehcache(play 中支持)或 memcached(play 也支持),用于集群环境。您可以通过静态名称 + 会话 ID 保存结果。因此,您只需要每个请求的会话 ID,它保存在客户端 cookie 中并在您的 play 应用程序中可用。您可以使用缓存数据来浏览页面。我还推荐 ElasticSearch。

编辑:更好的方法是您可以使用 play-search http://github.com/jfp/play-search,示例:

    Query q = Search.search("object:dogs", Folder.class);
q.orderBy("object")
    .page(2,5)
    .reverse();

PS:您对 Play 的决定是完美的。我是一名专业的 .net 开发人员,我可以说世界上唯一可以与 asp.net mvc 2 竞争的(最佳)Web 框架是 Play 框架。Grails 有问题,Django/Python、Yii/Php、Rails 都很慢,类型不安全,与 jvm/clr 框架相差甚远。wicket、tapestry、struts、jsf、spring mvc 都是冗长而无用的。spring roo 只是一个模板生成器。Asp.net mvc 超越了 asp.net 并成为了 .net 的第一大开发平台,但是 sun 为下一代的 jsf 克隆了一个旧的 asp.net 克隆,大错特错。在我看来,java 的唯一希望是 play framework。使用 scala 模块,它是完美的......

于 2010-07-06T20:23:08.713 回答
0

我对你的上下文有点迷茫,但如果我必须提供一个简短的答案,那就是搜索结果应该是模型的一部分。我假设您有一个可搜索的模型。您所做的是索引搜索和存储索引信息所需的部分(也使其成为模型的一部分)。执行搜索时,查询索引并显示结果。除非重新生成索引,否则第二次执行搜索不会包含新添加的项目。

这消除了使用任何会话状态的需要并使其保持安静,因为索引只是对资源执行的另一个操作。这是你需要的吗?

于 2010-07-05T10:51:30.757 回答