0

一些背景

所讨论的系统有大约一万条记录,允许用户通过不同搜索标准的“大量”阵列浏览或搜索。然后将结果显示在分页表中,范围从几页到数据库中的每个结果。

如果用户进行了大量过滤并最终得到结果并单击任意记录,则她将被带到一个新视图/edit/{record_id},在那里她可以查看该记录的所有详细信息。随时返回上一个搜索结果很容易,因为条件保留在搜索栏中,但是:

我想要达到的目标

如果用户要根据搜索结果进行大量更改,使用上一个和下一个按钮访问相邻记录而不返回结果会非常方便。

我已经能够使用ids在基本级别上做到这一点

SELECT table.*, pn.p as previous_question, pn.n as next_question
   from table,
   (
       SELECT id, lead(id) OVER w as n, lag(id) OVER w as p
       FROM table
       window w as (order by id $order)
   ) as pn
   where table.id = $id
       and pn.id = $id

这显然只适用于记录与数据库中的顺序相同的最简单的情况。我想要的是让他们在每种数据顺序情况下都能工作。不用说,对这些数据进行排序的方法几乎是无限的。

我一直在想什么

创建某种函数/工具,让我不让搜索 SQL 并像上面一样再次执行它,只使用搜索条件和偏移量而不是ids

将结果中所有记录的顺序列表保存$_SESSION在, 数据库或其他地方,然后简单地遍历列表以获取id我需要的 s。

手头的工具

PHP、PostgreSQL、JS/jQuery。

TL;博士

无论用户单击“下一步”多少次,我都希望能够在不返回搜索的情况下获得下一个搜索结果。

----------

任何输入将不胜感激。相关文章的链接、处理方法甚至整个shebang ;)。能够在不吃掉所有服务器内存或过多的数据库访问的情况下解决这个问题也很好,尽管资源在这里并不是真正的问题。

4

4 回答 4

2

我只是要把它扔在那里......你应该使用Solr或类似的东西,特别是如果这是一个SAS并且暴露给许多用户。

基本上尝试跟踪分页搜索结果然后遍历将导致您的应用程序中的大量状态管理。

Solr(甚至只是简单的 postgres)的想法是为您的搜索(又名OFFSETLIMIT)做一个开始和大小。Solr 的速度如此之快,几乎不是性能问题。只需确保您对 Solr 或 Postgres 进行可预测的排序(又名ORDER BY)。

如果您担心添加新项目会导致分页消失,那就是:WHERE create time stamp is less than when we did the initial search

于 2012-10-01T15:13:03.057 回答
0

我在这里看到了很多可能的问题。最重要的是您正在尝试将无状态的 HTTP 请求映射到有状态的数据库操作,并且您正在尝试尽可能无状态地执行此操作。

我认为 REST 方面的优雅解决方案是使用导航按钮(后退 esp)和向下钻取以获取特定的详细记录。这样就可以将基本结果持久化在客户端,即浏览器缓存中。

通过这种方式,您必须使用后退按钮才能返回(可能是分页的)摘要搜索结果,但您不必回击即可返回搜索条件。

于 2012-10-02T04:08:26.923 回答
0

存储搜索上下文,包括选定的过滤器、查询和排序顺序。可以选择按内容散列存储它们,以便最终获得唯一的搜索上下文列表。

在详细信息页面的链接中包含指向已保存搜索上下文的链接,使用某种哈希。

在详细信息页面上,通过散列检索搜索上下文并执行两个额外的搜索,一个在同一方向上前进,另一个在后退。通过在排序顺序定义中交换 asc 和 desc 来做到这一点。

在这两种情况下,将结果限制为 1 条记录,并添加一个附加子句以确保不包括当前详细记录。

这应该为您提供上一个和下一个链接的正确记录。

可以在此处找到 Elasticsearch 的更详细答案: https ://stackoverflow.com/a/42384125/401467

于 2017-02-22T06:32:14.457 回答
-1

解决这个问题的方法并不多。

1 - 因为您的查询是动态构建的,所以您必须坚持条件并在每次提供 LIMIT ... OFFSET 时执行查询,或者直接使用 result_id(在WITH子句中使用 row_number 窗口函数)。

2 - 您可以直接将结果集保存在服务器中,我不建议使用会话来存储这么多的数据。

3 - 或者您可以将集合保存在客户端,在 Json 中发送整个结果集并使用 angularjs 或主干js 之类的 Javascript 浏览它。我想如果你返回 10k 行,这也会很慢。

我建议1或3。

于 2012-10-01T15:47:59.987 回答