2016-07-11 8 views
0

Ich habe eine Reihe von Dokumenten mit einer Struktur wie:Summe-Aggregatfunktion mit nicht-eindeutigen Werten

<DOCUMENT> 
    <AMOUNTS> 
     <ELEMENT> 
      <AMOUNT>10.00</AMOUNT> 
      <INFO> 
       <CODE1>132</CODE1> 
       <CODE2>022</CODE2> 
      </INFO> 
     </ELEMENT> 
     <ELEMENT> 
      <AMOUNT>10.00</AMOUNT> 
      <INFO> 
       <CODE1>132</CODE1> 
       <CODE2>121</CODE2> 
      </INFO> 
     </ELEMENT> 
     <ELEMENT> 
      <AMOUNT>15.00</AMOUNT> 
      <INFO> 
       <CODE1>156</CODE1> 
       <CODE2>121</CODE2> 
      </INFO> 
     </ELEMENT>  
    </AMOUNTS> 
</DOCUMENT> 

Ich bin auf der Suche verschiedene Summen des AMOUNT Elements zu tun, damit ich gesetzt habe Pfadbereichsindex auf dem DOCUMENT/AMOUNTS/ELEMENT/AMOUNT Element, das die sum-aggregate-Funktion verwenden möchte. Allerdings sehe ich ein Problem bei der Verwendung der cts:sum-aggregate Funktion, wenn die Summe Dokumente umfasst, die mehr als ein Element mit dem gleichen Wert enthalten. Um das Problem zu veranschaulichen, gehe ich davon aus, dass das obige XML unter der '/DOCS/DOC1.XML'-URL gespeichert ist. Ich führe dann die folgende xQuery aus, um die Summe aller AMOUNTs im Dokument zu erhalten. Ich mache die Summe auf zwei verschiedene Arten und zwei unterschiedliche Ergebnisse erhalten:

(
    fn:sum(doc('/DOCS/DOC1.XML')/DOCUMENT/AMOUNTS/ELEMENT/AMOUNT), 
    cts:sum-aggregate(
     cts:path-reference("DOCUMENT/AMOUNTS/ELEMENT/AMOUNT"), 
     ("any"), 
     cts:document-query('/DOCS/DOC1.XML') 
) 
) 

Die fn:sum Funktion gibt 35 und die cts:sum-aggregate gibt 25. Die Summe-Aggregat Funktion ist nur einer der Werte einschließlich in die Summe.

Ich denke, ich mache etwas falsch, aber ich kann nicht herausfinden, was, kann jemand Licht für mich für dieses Licht?

Dank

David

Antwort

1

Ist Ihr Wegindex ein string Typ oder eine Zahl (float, double, etc.) geben? Ich würde nicht erwarten, dass dies überhaupt mit Strings funktioniert, aber vielleicht ist es das, und ich sehe nicht, dass Sie eine Option übergeben, um den Typ auf eine Zahl zu setzen (("any", "type=double")).

String-Indizes kombinieren identische (entsprechend der Sortierung) Werte in einem einzigen Eintrag und erhöhen den Wert des Eintrags cts:frequency. Wenn sum-aggregate über String-Indizes funktioniert (und ich sehe nichts in der Dokumentation, um etwas anderes zu empfehlen), könnte das erklären, warum der doppelte Wert nur einmal gezählt wird.

2

Nach dem Lesen der Antwort von WST habe ich bestätigt, dass der Typ meines Index dezimal war und spielte dann mit den Optionen ein bisschen herum und fand, dass das Hinzufügen von "Element-Frequenz" als Option zur Summenaggregatfunktion mein Problem löste . Ich verstehe die Nuancen zwischen "Element-Frequenz" und "Fragment-Frequenz" nicht vollständig in Bezug auf die Summen-Aggregat-Funktion, aber die folgende xQuery-Funktion funktioniert wie erwartet, dass beide Summen den gleichen Wert zurückgeben.

(
    fn:sum(doc('/DOCS/DOC1.XML')/DOCUMENT/AMOUNTS/ELEMENT/AMOUNT), 
    cts:sum-aggregate(
     cts:path-reference("DOCUMENT/AMOUNTS/ELEMENT/AMOUNT"), 
     ("item-frequency"), 
     cts:document-query('/DOCS/DOC1.XML') 
) 
) 
+0

Interessant. "item-frequency" wird typischerweise verwendet, um die Sortierreihenfolge nach Anzahl der Elemente in den Index-gegen-Nummer-Fragmenten (Dokumenten) anzuzeigen. Haben Sie versucht, den Typ explizit als "dezimal" zu definieren? – wst

+0

'fragment-frequency' bedeutet, dass es die Anzahl der Fragmente zählt, in denen ein bestimmter Wert aufgetreten ist, unabhängig davon, wie oft er in diesem Fragment aufgetreten ist. 'item-frequency' zählt die Vorkommen selbst, also war' item-frequency' genau das, was Sie gesucht haben. Und ja, "Fragment-Frequency" ist der Standard: http://docs.marklogic.com/cts:aggregate – grtjn