将 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 对我来说似乎很优雅。但当然这并不总是正确的答案。
我看到三个你没有提到的选项。
- 服务器端转换 - REST 搜索支持服务器端转换,在您执行 bulk read by query 时转换每个文档。这些服务器端转换可以生成您需要的任何 json。
- search extract-document-data - 这是提取文档部分的最简单方法。但是,如果您的文档 json 与您的 json 响应相匹配,这似乎是最好的。否则,您会在 json 响应中得到 xml。 . .除非你同意。
- 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然后调用。相关网址辅助:
- https://docs.marklogic.com/guide/rest-dev/search#id_48838
- https://docs.marklogic.com/guide/search-dev/appendixa#id_44222
至于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 的一部分。仅提及它,以便您了解在每种情况下使用的工具..
我正在制作一个演示,使用 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 对我来说似乎很优雅。但当然这并不总是正确的答案。
我看到三个你没有提到的选项。
- 服务器端转换 - REST 搜索支持服务器端转换,在您执行 bulk read by query 时转换每个文档。这些服务器端转换可以生成您需要的任何 json。
- search extract-document-data - 这是提取文档部分的最简单方法。但是,如果您的文档 json 与您的 json 响应相匹配,这似乎是最好的。否则,您会在 json 响应中得到 xml。 . .除非你同意。
- 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然后调用。相关网址辅助:
- https://docs.marklogic.com/guide/rest-dev/search#id_48838
- https://docs.marklogic.com/guide/search-dev/appendixa#id_44222
至于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 的一部分。仅提及它,以便您了解在每种情况下使用的工具..