2016-03-21 7 views
2

Ich arbeite an einer Demo mit MarkLogic, um aus Outlook exportierte E-Mails als XML zu speichern, sodass sie durchsuchbar und zugänglich bleiben, wenn ich mich von Outlook entferne.Rückgabe der MarkLogic EVAL REST-Serviceausgabe als JSON

Ich verwende ein AngularJS-Frontend, das entweder die nativen MarkLogic-REST-Services eigener REST-Services aufruft, die in JAVA mit Jersey geschrieben wurden.

MarkLogic SEARCH REST-Service funktioniert sehr gut, um eine Liste von Verweisen auf Dokumente basierend auf verschiedenen Suchkriterien zurück zu bekommen, aber ich möchte auch Informationen anzeigen, die in den gefundenen Dokumenten gespeichert sind.

Ich möchte mehrere REST-Aufrufe vermeiden und nur die benötigten Informationen abrufen, daher versuche ich den EVAL REST-Dienst zu verwenden, um eine xQuery auszuführen.

Es funktioniert gut, um XML zurück zu bekommen (innerhalb einer mehrteiligen/gemischten Nachricht), aber ich scheine JSON nicht zu bekommen, was viel bequemer wäre und mit den meisten anderen MarkLogic REST-Diensten sehr einfach ist.

Ich könnte "json: transform-to-json()" in meinem xQuery verwenden oder das XML in JSON in meinem JAVA-Code umwandeln, aber das sieht nicht sehr elegant für mich aus.

Gibt es eine effizientere Methode, um dorthin zu gelangen, wo ich hin will?

Antwort

5

Erstens, json: transform-to-json scheint mir sehr elegant. Aber natürlich ist es nicht immer die richtige Antwort.

Ich sehe drei Optionen, die Sie nicht erwähnt haben.

  1. serverseitige verwandelt - REST Suche unterstützt Transformationen Server-Seite, die jedes Dokument umwandeln, wenn Sie ein bulk read by query ausführen. Diese serverseitigen Transformationen könnten einen beliebigen json generieren.
  2. search extract-document-data - das ist die einfachste Möglichkeit, Teile von Dokumenten zu extrahieren. Aber es scheint am besten, wenn Ihre Dokumente json sind, um Ihre json Antwort zu entsprechen. Sonst bekommst du xml in deiner json Antwort. . . es sei denn, du bist damit einverstanden.
  3. custom search snippets - eine weitere sehr leistungsfähige Art und Weise anpassen, welche Suche

Alle diese Optionen gibt nicht die Privilegien erfordern, die eval erfordert, was eine sehr gute Sache ist. Da eval die Ausführung von beliebigem Code auf Ihrem Server erlaubt, benötigt es spezielle Privilegien und sollte mit großer Sorgfalt verwendet werden. Zwei weitere Optionen vor der Verwendung von eval sind (1) custom xquery installed in an http server und (2) REST extensions.

+0

Zunächst einmal vielen Dank für Ihre schnelle Antwort und mit vielen guten Informationen. Entschuldigung für den Begriff "nicht elegant", der vielleicht nicht der geeignetste war. Ich meinte, dass es einen besseren Weg geben muss, als den EVAL-Dienst zu nutzen, der in Bezug auf die Sicherheit nicht ideal ist. Ich habe getestet mit "extrahieren-Dokument-Daten", aber leider, wie Sie erklärt haben, gibt es eine Mischung aus JSON und XML, die nicht ideal ist. Ich dachte, XML und JSON wären nur zwei verschiedene Möglichkeiten, die gleichen Informationen aus der Sicht von MarkLogic zu präsentieren, aber anscheinend ist es nicht so einfach. –

+0

Vielleicht sollte ich nur Daten wie JSON wie im Beispiel SampleStack speichern. Beachten Sie die beiden anderen Optionen, die Sie vorschlagen: Es scheint mir, dass ein Massenlesen nach Abfrage jedes Dokument als einzelnen Teil einer mehrteiligen/gemischten Nachricht zurückgibt. Ist das bei einer Transformation gleich? Gibt es eine Möglichkeit, ein einzelnes JSON zurückzubekommen? Würden Sie eine Probe haben? Ich denke, ich denke auch an benutzerdefinierte Suchausschnitte. –

+0

Was würden Sie als den besten Ansatz empfehlen? –

1

Die Antworten von Sam sind, was ich vorschlagen würde. Speziell würde ich eine Suchoption für Such-Extrakt-Dokument-Daten setzen (Dies ist eine Such-API-Option. Wenn Sie die Anfrage veröffentlichen, dann können Sie die Option in der XML-Datei zurückgeben. Wenn Sie GET verwenden, dann Sie brauchen die Möglichkeit, im voraus zu registrieren und es nennen Relevant URLs zu unterstützen.

Was json .. ML8 Inhalt verwandeln Verwenden Sie die accept-Header. oder füge einfach format = json zu deinen Ergebnissen hinzu ...

Beispiel - xml, das ist, was mein Gehalt als gespeichert:
http://localhost:8000/v1/search?q=watermellon ...

<search:result index="1" uri="/sample/collections/1.xml" path="fn:doc("/sample/collections/1.xml")" score="34816" confidence="0.5982239" fitness="0.6966695" href="/v1/documents?uri=%2Fsample%2Fcollections%2F1.xml" mimetype="application/xml" format="xml"> 
<search:snippet> 
<search:match path="fn:doc("/sample/collections/1.xml")/x"> 
<search:highlight>watermellon</search:highlight> 
</search:match> 
</search:snippet> 
</search:result> 

...
Beispiel - json das ist, was mein Gehalt als gespeichert:
http://localhost:8000/v1/search?q=watermellon&format=json ...

 "index":1, 
     "uri":"/sample/collections/1.xml", 
     "path":"fn:doc(\"/sample/collections/1.xml\")", 
     "score":34816, 
     "confidence":0.5982239, 
     "fitness":0.6966695, 
     "href":"/v1/documents?uri=%2Fsample%2Fcollections%2F1.xml", 
     "mimetype":"application/xml", 
     "format":"xml", 
     "matches":[ 
      { 
       "path":"fn:doc(\"/sample/collections/1.xml\")/x", 
       "match-text":[ 
        { 
        "highlight":"watermellon" 
        } 
       ] 
      } 
     ] 
     } 

...

Für echtes Heavy-Lifting können Sie serverseitige Transformationen wie in Sams Beschreibung verwenden. Ein Hinweis darauf. Serverseitige Transformationen sind nicht Teil der Such-API, sondern Teil der REST-API. Erwähnen Sie es einfach, damit Sie eine Vorstellung davon haben, welches Werkzeug Sie in jedem Fall verwenden.