You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否不使用AdhocQuery通过XCC及Java类查询MarkLogic?

当然可以!你完全不需要依赖AdhocQuery来通过XCC与MarkLogic交互,而且用XCC Java类连接MarkLogic是非常普遍的做法——不少开发者都在生产环境里这么用。下面我来详细解答你的疑问:

1. 不使用AdhocQuery的XCC交互方案

AdhocQuery只是XCC提供的临时XQuery执行工具,XCC的核心是Session和各种Request实现类,有很多方式可以绕开临时XQuery来完成操作:

a. 用DocumentManager直接操作文档

这是最常用的场景,比如读写、删除文档,全程不需要写任何XQuery。底层是XCC封装好的请求逻辑,直接调用API即可:

// 初始化连接会话
Session session = XccFactory.newInstance().newSession("xcc://username:password@your-host:8000/your-database");
DocumentManager docMgr = session.newDocumentManager();

// 读取指定URI的文档
String docContent = docMgr.read("/documents/sample.xml").asString();
System.out.println("文档内容:" + docContent);

// 插入新文档
String newDocContent = "<user><name>Alice</name><age>30</age></user>";
docMgr.write("/documents/new-user.xml", new StringHandle(newDocContent));

// 关闭会话
session.close();

b. 调用预部署的模块(ModuleInvoke)

如果你已经在MarkLogic中部署了XQuery/JavaScript模块(比如存放在/modules目录下),可以用ModuleInvoke直接调用这些模块,不需要在代码里写临时XQuery:

Session session = XccFactory.newInstance().newSession("xcc://username:password@your-host:8000/your-database");

// 调用预部署的模块,传入参数
ModuleInvoke moduleRequest = session.newModuleInvoke("/modules/user-query.xqy");
moduleRequest.setNewStringParam("user-id", "12345");

// 执行并获取结果
ResultSequence rs = moduleRequest.execute();
while (rs.hasNext()) {
    ResultItem item = rs.next();
    System.out.println("查询结果:" + item.asString());
}

session.close();

这种方式既避免了临时XQuery的硬编码,又能复用MarkLogic上的模块逻辑,非常适合复杂业务场景。

c. 用QueryRequest执行结构化搜索

如果需要做搜索查询,可以用QueryManager构建结构化查询(StructuredQuery),全程用Java API拼接查询条件,不需要写XQuery:

Session session = XccFactory.newInstance().newSession("xcc://username:password@your-host:8000/your-database");
QueryManager queryMgr = session.newQueryManager();

// 构建结构化查询:查找content元素中包含"MarkLogic"的文档
StructuredQueryBuilder sqb = queryMgr.newStructuredQueryBuilder();
StructuredQuery query = sqb.value(sqb.element("content"), "MarkLogic");

// 创建查询请求并执行
QueryRequest searchRequest = queryMgr.newQueryRequest(query);
ResultSequence rs = searchRequest.execute();

// 遍历结果,输出文档URI
while (rs.hasNext()) {
    ResultItem item = rs.next();
    System.out.println("匹配的文档URI:" + item.getUri());
}

session.close();
2. Session和Request类的核心作用

Session是XCC连接的基础,负责管理与MarkLogic的连接会话;而各种Request子类(包括ModuleInvoke、QueryRequest,甚至DocumentManager底层的操作)都是基于Session创建的执行单元。你完全可以通过这些Request实现所有需要的操作,根本不需要用到AdhocQuery。

内容的提问来源于stack exchange,提问作者tjm12345

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:34:04