2016-06-06 10 views
2

AKTUALISIERT: siehe Ende - ein Beispiel zeigt, dass Cts: Uris ist kein gültiger Ansatz, da es nicht in allen Fällen die richtigen Ergebnisse zurückgibt.Zurück nur URIs aus CTS: Reverse-Abfrage

Ich habe einen Anwendungsfall wo in MarkLogic ich manchmal hunderttausende Übereinstimmungen in einem Suchergebnis habe, das eine cts: reverse-Abfrage enthält. Damit möchte ich nur die URIs der Dokumente zurückgeben, die zu den Ergebnissen passen, so dass ich sie später cachen und über Corb2 verarbeiten kann.

Beispielcode:

xquery version "1.0-ml"; 


let $_ := xdmp:invoke-function(function(){ 
    for $val in ("foo", "bar", "baz") 
    let $query := <query>{cts:element-word-query(xs:QName("what"), ($val))}</query> 
    return (
       xdmp:document-insert("/test/reverse-" || $val ||".xml", $query,(), ("test-reverse")), 
       xdmp:commit() 
      ) 

},<options xmlns="xdmp:eval"> 
     <transaction-mode>update</transaction-mode> 
     </options> 
) 


return for $result in cts:search(collection("test-reverse"), cts:reverse-query(<what>baz</what>)) 
    return xdmp:node-uri($result) 

Und dies zurück:

/test/reverse-baz.xml 

Welche erwartet wird.

Allerdings habe ich fühlen wie ich bin zu viel Verarbeitung hier, da ich bereits ein Dokument von cts: search(). Aber dann wieder, da ML Lazy ist, vielleicht sogar jetzt, ich habe wirklich nur eine Referenz, da ich nichts in dem Dokument zugegriffen habe ..?

Was ich möchte, ist die Verwendung von cts: uris(), um das gleiche Ergebnis wie oben zu erhalten. Sie können jedoch nicht cts: reverse-query mit cts: uris() verwenden

Ja, ich verstehe, dass eine Reverse-Abfrage muss nie unbedingt in der Datenbank als ein Dokument, um es zu verwenden (cts: enthält Beispiel), In einigen Anwendungsfällen existieren URIs nicht einmal. Aber für mich tun sie das.

Auch, ich bin ziemlich sicher, dass ich xdmp verwenden können: Plan() die Abfrage zu erzeugen, die für cts: URIs() durch die final-Plan herausziehen und neu zu schreiben den Namespace cts, aber ich bin mir nicht sicher, ob das noch schneller ist.

Mit den oben genannten, (2) Fragen unter:

  1. Für jemanden, der die Interna von Marklogic versteht, würden Sie als cts-Suche-> for-Schleife -> sdmo: node-uri() sein, effizient und wenig Auswirkung (mit anderen Worten, ich nehme dies ohne Erweiterung des Dokuments in den erweiterten Baum-Cache?)
  2. Wenn nicht, können Sie sich eine effizientere Möglichkeit zur Nachahmung CTS: Uris auf eine schnellere Weise als ich über?

Warum nicht cts: URIs() -, weil ich keine Einträge finden, ich wieder alles:

xquery version "1.0-ml"; 


let $_ := xdmp:invoke-function(function(){ 
    for $val in ("foo", "bar", "baz") 
    let $query := <query>{cts:element-word-query(xs:QName("what"), ($val))}</query> 
    return (
       xdmp:document-insert("/test/reverse-" || $val ||".xml", $query,(), ("test-reverse")), 
       xdmp:commit() 
      ) 

},<options xmlns="xdmp:eval"> 
     <transaction-mode>update</transaction-mode> 
     </options> 
) 


return cts:uris((),(), 
    cts:and-query((
    cts:collection-query("test-reverse"), 
    cts:reverse-query((<foo/>)) 
))) 

Returns:
/test/reverse-bar.xml
/test/reverse-baz.xml
/test/reverse-foo.xml

Und die letzte Probe den Unterschied in den Ergebnissen zeigen (Validierung, dass cts: uris nicht funktioniert):

xquery version "1.0-ml"; 


let $_ := xdmp:invoke-function(function(){ 
    for $val in ("foo", "bar", "baz") 
    let $query := <query>{cts:element-word-query(xs:QName("what"), ($val))}</query> 
    return (
       xdmp:document-insert("/test/reverse-" || $val ||".xml", $query,(), ("test-reverse")), 
       xdmp:commit() 
      ) 

},<options xmlns="xdmp:eval"> 
     <transaction-mode>update</transaction-mode> 
     </options> 
) 

let $uris-from-cts-uris := cts:uris((),(), 
    cts:and-query((
    cts:collection-query("test-reverse"), 
    cts:reverse-query(<foo/>) 
))) 

let $uris-from-search := for $result in cts:search(collection("test-reverse"), cts:reverse-query(<foo/>)) 
    return xdmp:node-uri($result) 

return 
(
    $uris-from-cts-uris, 
    "xxxxxxxxxxxxxxxxx", 
    $uris-from-search 

) 

, die in diesen Ergebnisse:

/test/reverse-bar.xml
/test/reverse-baz.xml
/test/reverse-foo.xml
XXXXXXXXXXXXXXXXX

Dieser lautet: cts: uris nur gav mir die ganze sammlung, wenn sie mir nichts gegeben haben sollte und cts: suche gab die richtige antwort.

Antwort

3

Warum können Sie nicht cts: reverse-query() mit cts: uris() verwenden?

Versuchen Sie folgendes:

cts:uris((),(), 
    cts:and-query((
    cts:collection-query("test-reverse"), 
    cts:reverse-query(<what>baz</what>) 
))) 
+0

OK. Vielen Dank. Ich muss verrückt werden. Ich muss später das Client-s-Beispiel betrachten (mit einer komplexeren umgekehrten Abfrage). Das funktioniert jedoch, wie Sie beschreiben - und in meinem lokalen Beispiel von ein paar hunderttausend Reverse-Abfragen funktioniert gut! Prost. –

+0

Ich habe gerade meine Antwort erweitert und auch einen Kommentar gepostet. Ich bekomme Situationen, in denen ich falsch positive Ergebnisse mit cts: uris bekomme. Aber ich verfolge dies bis zu einem Problem mit den umgekehrten Indizes vor einer Zusammenführung ..? Sobald ich das aufspüre und eine Antwort habe, dann ist vielleicht cts: uris großartig. Danke –

0

Ahh - und jetzt sind wir auf etwas. Ich habe falsche Treffer wie beschrieben. ABER, nachdem ich manuell zusammengeführt habe, bekam ich die richtigen Antworten. Also, mit Vor-Merge-und Post-Merge-Ergebnisse zu graben, um zu sehen, ob ich die Ursache finden kann ...

Also, cts: uris ist gültig, aber nicht immer und anscheinend im Zusammenhang mit der Verschmelzung ..?

+0

Ich würde nicht erwarten, dass es mit Zusammenführungsaktivität verbunden ist. Eine Sache zu beachten ist, dass cts: uris() ungefiltert ist, so dass Sie ausreichende Indexinformationen haben müssen, um genaue Ergebnisse für die Abfragen zu erhalten, die Sie haben. –

+0

danke. Ich werde genauer hinsehen, um zu sehen, warum ich manchmal andere Ergebnisse bekomme. Aber selbst dann, wenn cts: uris nicht funktioniert, gibt es tatsächlich alles zurück .. nicht nichts .. sicherlich nicht das, was ich erwarten würde oder möchte. –