5

marklogic の検索機能を使用して検索ページを作成します。現時点では、XQuery を実行して検索結果を取得していますsearch:search。必要最小限の例として、次のコードを参照してください。

    xquery version "1.0-ml";
import module namespace search = "http://marklogic.com/appservices/search"
        at "/MarkLogic/appservices/search/search.xqy";

search:search('test',
     <options xmlns='http://marklogic.com/appservices/search'></options>)

この検索で​​は、データベース内のすべてのコンテンツが検索されますが、多くの場合は問題ありません。それ以外の場合は、コレクションに基づいて検索しcts:collection-queryます。コレクションは、検索の優れたコンテキストとして機能します。

ここで、「メイン」ドキュメント内のデータの関係に基づいて検索結果を制限したいと考えています。この「メイン」ドキュメントには、オブジェクト モデル内のすべての関係が含まれています。そのオブジェクト モデルがドキュメントへの参照を持っている場合、そのドキュメントを検索に含めたいと思います。基本的に、「メイン」/モデル ドキュメントは検索のコンテキストです。

私はこれを実現するための最良の方法についていくつかのアイデアをブレインストーミングしようとしていました. これが私がこれまでに思いついたことですが、Marklogicに精通している人(私は6か月しか使っていません)が私を良い方向に導いてくれることを望んでいました:

  1. モデル ドキュメントで参照されているすべてのドキュメントを一意のコレクションに追加します。次に、そのコレクションに基づいて検索をクエリします。ただし、モデルが変更されると、コレクションを更新する必要があります。
  2. モデル ドキュメントをコードにロードし、すべての参照のリストを取得して、cts:document-query(または同様の方法で) クエリに追加します。
  3. XML 文書で「モデル」の概念を何らかの方法で再構築します。

ご意見やご提案をありがとうございます。

4

2 に答える 2

3

(2) から始めて、パフォーマンスが十分かどうかを確認します。それはあなたのユースケースに依存しますが、数千または数十万の参照でも問題ないと思います。

必ず単項を使用してくださいcts:document-query($list-of-references)cts:or-query(for $ref in $list-of-references return cts:document-query($ref))インデックス ルックアップは、N 個の個別のルックアップではなく 1 回のパスで実行できるため、よりも高速になります。

于 2013-08-15T19:06:15.463 に答える
2

これらのアイデアはすべてうまくいくでしょう。どちらを使用するかの決定は、メイン ドキュメントが変更される頻度 (およびそれを制御できるか) や、XML の再構築がどれほど難しいかなど、アプリケーションの詳細に依存します。

考慮すべきもう 1 つの点は、コレクションの変更を自動的に実行できるドキュメントの更新時にトリガーを設定できることです。

-デビッド・リー

于 2013-08-15T17:57:18.433 に答える