2017-07-22 7 views
0

Betrachten Sie die folgende Abfrage:Mit ungefilterte Suche in Marklogic

xquery version "1.0-ml"; 
declare namespace ts = "http://marklogic.com/MLU/top-songs"; 

let $range_query := cts:element-range-query(xs:QName("ts:week"), ">=", xs:date("2009-05-01")) 
let $query := cts:search(fn:doc(), $range_query) 
return $query/ts:top-song/ts:title/text() 

(Nicht: Bereich Index für Woche wurde aktiviert)

Ich glaube, dass die obige Abfrage-Ergebnisse auf Basis geben kann nur auf die Indizes und mit dieser Annahme habe ich die folgende Änderung vorgenommen:

let $query := cts:search(fn:doc(), $range_query, "unfiltered") 

Ich habe die gleichen Ergebnisse. Jedoch

,

fn:count($query/ts:top-song/ts:title/text()) gave a result of 8 

und

xdmp:estimate($query/ts:top-song/ts:title/text()) 

gab einen Fehler: Ausdruck ist unerforschlich

Ich glaube, dies bedeutet, dass die Abfrage kann nicht mit Indizes gesucht werden. Wenn ja, warum funktioniert der ungefilterte Ansatz gut?

Antwort

1

Die ungefilterte Suche funktioniert und der Ausdruck xdmp:estimate funktioniert nicht, weil sie nicht dieselbe Abfrage und denselben Ausdruck verwenden. Die Abfrage Sie cts:search Pass ist vollständig durchsuchbar, so wird es funktionieren, wenn Sie xdmp:estimate auf ihn nennen:

xdmp:estimate(cts:search(fn:doc(), $range_query, "unfiltered") 

xdmp:estimate erfordert eine „teilweise durchsuchbar“ XPath-Ausdruck, which has a specific definition according to MarkLogic. Es gibt einige feine Details über das, was macht einen Ausdruck ganz oder teilweise oder nicht durchsuchbar, und wahrscheinlich der lehrreichste Weg, um es zu tun ist mit xdmp:query-trace, um den Ausdruck zu testen.

+0

Ich denke, du meintest xdmp: Schätzung ($ query) sollte mir die Antwort geben. Allerdings gibt es immer noch den Fehler: Ausdruck ist nicht durchsuchbar – Yash

+0

@ Yash, Nein, ich wollte nicht das "Let" kopieren. Die Variablenreferenz ist nicht suchbar. Ich habe die Antwort aktualisiert. – wst