将 MarkLogic EVAL REST 服务输出返回为 JSON

Returning MarkLogic EVAL REST service output as JSON

我正在制作一个演示,使用 MarkLogic 将从 Outlook 导出的电子邮件存储为 XML,这样当我离开 Outlook 时,它们仍可搜索和访问。

我正在使用 AngularJS 前端调用使用 Jersey 在 JAVA 中编写的自己的 REST 服务的本机 MarkLogic REST 服务。

MarkLogic SEARCH REST 服务非常适合根据各种搜索条件取回文档引用列表,但我还想显示存储在找到的文档中的信息。

我想避免多次 REST 调用并只取回所需的信息,因此我尝试使用 EVAL REST 服务来 运行 一个 xQuery。

恢复 XML 效果很好(在 multipart/mixed 消息中),但我似乎无法获得 JSON 反而会更方便和对于大多数其他 MarkLogic REST 服务来说非常容易。

我可以在我的 xQuery 中使用 "json:transform-to-json()" 或在我的 JAVA 代码中将 XML 转换为 JSON,但这对我来说看起来不太优雅。

是否有更有效的方法到达我想去的地方?

首先,json:transform-to-json 对我来说似乎很优雅。但当然这并不总是正确的答案。

我看到三个你没有提到的选项。

  1. 服务器端转换 - REST 搜索支持服务器端转换,在您执行 bulk read by query 时转换每个文档。这些服务器端转换可以生成您需要的任何 json。
  2. search extract-document-data - 这是提取文档部分的最简单方法。但是,如果您的文档 json 与您的 json 响应相匹配,这似乎是最好的。否则,您会在 json 响应中得到 xml。 . .除非你同意。
  3. custom search snippets - 自定义搜索内容的另一种非常强大的方法 returns

所有这些选项都不需要 eval 所需的特权,这是一件非常好的事情。由于 eval 允许在您的服务器上执行任意代码,因此它需要特殊权限并且应该非常小心地使用。使用 eval 之前的另外两个选项是 (1) custom xquery installed in an http server, and (2) REST extensions.

Sam 的回答是我的建议。具体来说,我会为 search-extract-document-data 设置一个搜索选项(这是一个搜索 API 选项。如果您正在 posting 请求,那么您可以在 XML你post回来了。如果你用的是GET,那么你需要提前注册option然后调用。相关网址辅助:

至于json.. ML8会转换内容。使用 accept-header 或仅将 format=json 添加到您的结果中...

示例 - xml 我的内容存储为:
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>

...
示例 - json 我的内容存储为:
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"
                  }
               ]
            }
         ]
      }

...

对于真正繁重的工作,您可以按照 Sam 的描述使用服务器端转换。关于这一点的一个注释。服务器端转换不是搜索 API 的一部分,而是 REST API 的一部分。仅提及它,以便您了解在每种情况下使用的工具..