2013-08-15 3 views
5

marklogicの検索機能を使用して検索ページを作成しました。現在、XQueryを実行して検索結果をsearch:searchにしています。Marklogicでの検索のコンテキストとしてのデータ関係

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文書のなんらかの形で私の "モデル"の概念を再構成します。

ご意見ありがとうございました。

+1

#1で終了しました。 #2は私のデータベースで約3倍遅かった。また、XMLの膨大なリレーションシップモデルのため、#2のコードは醜いものになり始めました。コレクションを導入することで、すべての開発者が簡単に再利用できるようになりました。私は、将来、トリガーを実装する可能性が最も高いでしょう。 – Paul

答えて

2

これらのアイデアはすべてうまくいくはずです。使用するかどうかは、メイン文書がどのくらいの頻度で変更されているか(そして管理しているかなど)、 XMLの改造の難しさなど、アプリケーションの詳細によって決まります。

さらに、コレクションの変更を自動的に実行できるようにするドキュメントの更新にトリガーを設定することもできます。

-Davidリー

+0

私はトリガーを追加するのが好きです。 – Paul

3

私は(2)で開始し、パフォーマンスが十分であるかどうかを確認します。それはあなたのユースケースに依存しますが、私はそれが何千、何十万もの参考文献に対してうまくいくはずです。

必ずcts:document-query($list-of-references)という単項を使用してください。インデックスルックアップはN個の別々のルックアップの代わりにシングルパスになる可能性があるので、それはcts:or-query(for $ref in $list-of-references return cts:document-query($ref))より速くなります。

関連する問題