2017-08-23 9 views
0

文書間で検索することはできますが、配列要素内の特定のプロパティを使用して検索することはできますか?さらに、同じ文書内の他の配列要素が一致しないため、結果には一致する配列要素のみが含まれ、文書全体は含まれない可能性があります。配列やオブジェクト内でMarklogicを検索し、一致する配列項目のみを返します(javascript)

例:JSON Marklogicドキュメント { "name": "aName", "children": [{ "name": "A", "target": { "min": 2, "max": 10 } },{ "name": "B", "target": { "min": 22, "max": 32 } },{ "name": "C", "target": { "min": 4, "max": 7 } }] } 与えられた私だけだけchildren[0]children[2]が一致します。この場合、childrenどこtarget.min < 5とtarget.max> 5.

をマッチさせたいです。どのようにして返されるクエリを指定するにはどうすればいいですか: [ { "name": "A", "target": { "min": 2, "max": 10 } }, { "name": "C", "target": { "min": 4, "max": 7 } } ]

関連するクエリはどのように構成しますか? N.B.私はサーバー側のjavascriptやNode.jsの実装を好むだろう。

答えて

2

を試し、それらのいずれかがあなたのニーズを満たすかどうかを確認するためにqueryBuilder.extractや検索応答変換を見てみましょう。両方のトピックについては、ここで説明します:http://docs.marklogic.com/guide/node-dev/search#id_24160

SJSでは、jsearchマッパーとレジューサーフックが同様の機能を提供します。 「マップと縮小を使用した結果の変換」の次のトピックを参照してください。http://docs.marklogic.com/guide/search-dev/javascript#id_49222

+0

ありがとう@kcoleman。私はmap/reduceを見ています - おそらく私が今のところ最高です。 私はこれはむしろ非効率だと言わなければならない。私は 'cts.pathRangeQuery(" children [*]。target.min "、" <"、5)'のようなものを指定し、それをjsearchクエリの一部として使用することができます。それからmap/reduce関数の中で同様のチェックをしなければなりません。面白いことに、質問を特定のレベル(例えば、http://docs.marklogic.com/guide/search-dev/structured-query#id_87231)で結果を返すことができればいいですか? – Kholofelo

+0

興味深いことに私は 'を使うことができます。ドキュメント内のどこで一致が起こっているのかを正確に見つけるためにmap({snippet:true})を実行してください。次に、一致するドキュメントの部分をフェッチするために別のクエリを実行する必要があります。 – Kholofelo

+0

私は、これらの他のインターフェイスではできない構造化クエリを使って何ができると思っているのか混乱しています。構造化されたクエリは、文字通り、文法的には唯一のものですが、cts:queryの上にあります。すべての検索インターフェイスの目的は、クエリに一致するドキュメントを見つけることです。必要に応じて一致を変換するためのいくつかのフックと、スニペットのようないくつかのデフォルトオプションも提供します。 – kcoleman

0

は、Node.jsのために、この

var a = { 
    "name": "aName", 
    "children": [{ 
     "name": "A", 
     "target": { 
      "min": 2, 
      "max": 10 
     } 
    },{ 
     "name": "B", 
     "target": { 
      "min": 22, 
      "max": 32 
     } 
    },{ 
     "name": "C", 
     "target": { 
      "min": 4, 
      "max": 7 
     } 
    }] 
}; 

var b = []; 

for(var i of a.children){ 
if(i.target.min < 5 && i.target.max > 5){ 
b.push(i); 
} 

} 

console.log(b); 
+0

これは、純粋なjavascriptです。これは、小さな配列でも問題ありません。私が求めている質問は、Marklogicを使ってそれを行う方法です。これによって何千ものJSONドキュメントがあるかもしれません。私はこれを達成するための一種の質問があるはずだと思います。とにかく、あなたの答えをありがとう。 – Kholofelo

2

MarkLogic 9では、TDEを使​​用して、最小値と最大値を持つ各子の行を投影し、その比較でOpticクエリを使用できます。

現在、OpticはNode.jsでは使用できませんが、これは予定されています。

MarkLogic 8では、各子を個別のドキュメントとしてモデル化し、minおよびmaxに範囲インデックスを作成するのが最善の方法です。

助けてくれること

+0

ありがとうございます。私はmarklogic 9を使用しています。しかし、現時点では、個々の文書として子供を持つことが最善の考えであるようです。さもなければ他はすべて非常に複雑になります。 ありがとう – Kholofelo

関連する問題