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:
- 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?)
- 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.
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. –
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 –