我正在使用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,但这对我来说看起来并不优雅。
是否有更有效的方法可以到达我想去的地方?
答案 0 :(得分:5)
首先,json:transform-to-json对我来说似乎很优雅。但当然,并不总是正确的答案。
我看到你提到的三个选项。
所有这些选项都不需要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的一部分。只需提一下,就可以了解每种情况下使用的工具..