1

MarkLogic サーバーには約 5,300,000 のドキュメントがあり、単純な検索アプリケーションを構築しています。ユーザーが検索語を入力すると、MarkLogic サーバーはすべてのドキュメントのすべてのノードでその語を検索し、一致するドキュメントを結果として返します。ページごとに結果を表示するカスタム ページングを実装しました。1 ページあたり 10 件の結果を表示しています。

私はこれに検索APIを使用しています:-

import module namespace search="http://marklogic.com/appservices/search" at "/Marklogic/appservices/search/search.xqy";

declare variable $options:=

<options xmlns="http://marklogic.com/appservices/search">

    <transform-results apply="raw"/>

</options>;

search:search($p, $options, $noRecFrom, 10)/search:result

$p はユーザーからの入力です $noRecFrom は、どこからレコードを表示する必要があるかを示す番号です。たとえば、ページ 1 の $noRecFrom は 1、ページ 2 の $noRecFrom は 11、ページ 3 の $noRecFrom は 21 などです。ページングには、最初、次、前、および最後のページに移動するためのハイパーリンクがあります。

返されたレコードの総数を計算するには、次を使用しています:-

for $x in search:search($p, $options)

return $x//@total;

最初、次、前のハイパーリンクは完全に機能しますが、誰かが最後をクリックすると、アプリケーションは応答を停止し、クエリは出力を表示しません。データベース内のドキュメントの数が多いためですか、それとも実装が間違っていますか。

ユーザーがこのような大規模なデータベースのクエリ結果で遅延なく最後のページに移動できるように、MarkLogic (search:search 用) で効率的なページネーションの方法はありますか?

4

3 に答える 3

4

実装した方法では、 for ループで検索を繰り返し実行しています。そして、それは確かに遅いでしょう。

代わりに、@total と 1 ページあたりのドキュメント数に基づいて $start パラメーターを計算し、それを引数 (3 つ目だと思います) として search:search に渡す必要があります。

また、フィルターなしモードで実行できることを確認することをお勧めします。開発者サイトには、高速ページネーション (インデックスなど) の最適化に関する適切な情報があります。アイデアは、インデックスからクエリを解決して、非常に優れた正確なフィルタリングされていないパフォーマンスを提供することです。

そんなことしたら

于 2012-04-11T14:45:09.903 に答える
0

上記の cwhit によって言及された問題を解決した後でも、データの最後のページをより高速に取得したい場合は、ソート順を逆にしてレコードの正しいオフセットを取得できるようにコードを賢くすることができます。

もう 1 つのヒントを次に示します。MarkLogic が search:search で何を行っているかをよりよく理解するには、次のように呼び出します。

search:get-default-options()

一般的な検索アプリケーションの出発点をご覧ください。

于 2012-04-11T17:59:13.827 に答える
0

ページ分割された検索に関するチュートリアルがhttp://developer.marklogic.com/learn/2006-09-paginated-searchにあります。

于 2012-04-11T14:29:16.250 に答える