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

时间:2016-03-21 13:28:01

标签: json xml rest eval marklogic

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

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

MarkLogic SEARCH REST服务可以很好地根据各种搜索条件获取文档引用列表,但我还希望显示存储在找到的文档中的信息。

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

它可以很好地恢复XML(在多部分/混合消息中),但我似乎无法获得JSON,这对于大多数其他MarkLogic REST服务来说更方便,更容易。

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

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

2 个答案:

答案 0 :(得分:5)

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

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

  1. 服务器端转换 - REST搜索支持服务器端转换,在执行bulk read by query时转换每个文档。那些服务器端转换可以生成你需要的任何json。
  2. search extract-document-data - 这是提取部分文档的最简单方法。但是,如果您的文档是json以匹配您的json响应,这似乎是最好的。否则你在json响应中得到xml。 。 。除非你对此表示满意。
  3. custom search snippets - 自定义搜索返回的另一种非常强大的方法
  4. 所有这些选项都不需要eval所需的权限,这是一件非常好的事情。由于eval允许在服务器上执行任意代码,因此它需要特殊权限,因此应谨慎使用。使用eval之前的另外两个选项是(1)custom xquery installed in an http server和(2)REST extensions

答案 1 :(得分:1)

Sam的回答是我的建议。具体来说,我会为search-extract-document-data设置一个搜索选项(这是一个搜索API选项。如果你发布请求,那么你可以在你发回的XML中添加选项。如果你使用GET,那么您需要提前注册该选项并进行调用。相关的网址可以提供帮助:

至于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的一部分。只需提一下,就可以了解每种情况下使用的工具..