0

いくつかの背景

問題のシステムには約1万件のレコードがあり、ユーザーはさまざまな検索条件の「大規模な」配列を参照または検索できます。結果は、数ページからデータベース内のすべての結果までの範囲のページ化されたテーブルに表示されます。

ユーザーが多くのフィルタリングを行い、結果が得られて任意のレコードをクリックした場合、ユーザーは新しいビュー/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

これは明らかに、レコードがデータベースと同じ順序である最も単純な場合にのみ機能します。私が望んでいるのは、データの順序付けのすべての場合にそれらが機能することです。言うまでもなく、このデータを並べ替える方法はほぼ無限です。

私が考えていたこと

idSQLを検索から除外し、上記のように、 sの代わりに検索条件とオフセットを使用して再度実行できるような関数/ツールを作成します。

結果内のすべてのレコードの順序のリストを$_SESSION、データベースまたは他の場所に保存してidから、リストをトラバースして必要なを取得します。

手元のツール

PHP、PostgreSQL、JS/jQuery。

TL; DR

ユーザーが「次へ」を何度クリックしても、検索に戻らずに次の検索結果にたどり着くことができるようにしたいと思います。

----------

任意の入力をいただければ幸いです。関連する記事へのリンク、これまたはシバン全体にアプローチする方法;)。ここではリソースは実際には問題ではありませんが、すべてのサーバーメモリや過剰なデータベースアクセスを消費せずにこれを解決できると便利です。

4

4 に答える 4

2

私はそれを捨てるつもりです...特にこれがSASで多くのユーザーに公開されている場合は、 Solrまたは同様のものを使用する必要があります。

基本的に、ページ化された検索結果を追跡しようとしてからトラバースすると、アプリで多くの状態管理が発生します。

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

選択したフィルター、クエリ、並べ替え順序などの検索コンテキストを保存します。オプションで、コンテンツごとにハッシュ化して保存し、検索コンテキストの一意のリストを作成します。

ある種のハッシュを使用して、保存された検索コンテキストへのリンクを詳細ページへのリンクに含めます。

詳細ページで、ハッシュを介して検索コンテキストを取得し、2つの追加検索を実行します。1つは同じ方向に進み、もう1つは逆方向に進みます。これを行うには、ソート順定義でascとdescを交換します。

どちらの場合も、結果を1レコードに制限し、現在の詳細レコードが含まれないようにする句を追加します。

これにより、前のリンクと次のリンクの正しいレコードが得られます。

Elasticsearchの詳細な回答は、 https ://stackoverflow.com/a/42384125/401467にあります。

于 2017-02-22T06:32:14.457 に答える
-1

この問題に対する解決策はそれほど多くありません。

1-クエリは動的に構築されるため、LIMIT ... OFFSETを指定するたびに基準を永続化してクエリを実行するか、(WITH句でrow_numberウィンドウ関数を使用して)result_idを直接実行する必要があります。

2-サーバーに結果セットを直接永続化できます。このような量のデータを保存するためにセッションを使用することはお勧めしません。

3-または、コレクションをクライアントに永続化して、結果セット全体をJsonで送信し、angularjsやbackbonejsなどのJavascriptで参照することもできます。10k行を返すと、これも非常に遅くなると思います。

1か3をお勧めします。

于 2012-10-01T15:47:59.987 に答える