使用MarkLogic Java API查询单个XML元素关联的多值数据
没问题!我帮你梳理下怎么用MarkLogic Java API实现单个XML元素关联多值的查询,结合你的文档结构来给你具体代码示例~
首先先补全你的XML文档结构(方便后续理解):
datatypename1 datatype1 code1value1 code2value2 code3value3
场景1:查询包含指定多值的文档
比如你要找所有包含<code>为code1 或 code2的文档,或者同时包含这两个值的文档,代码如下:
1. 初始化MarkLogic客户端
// 替换成你的MarkLogic服务地址、端口和认证信息 DatabaseClient client = DatabaseClientFactory.newClient( "localhost", 8000, new DatabaseClientFactory.DigestAuthContext("your-username", "your-password") );
2. 构建多值查询
用StructuredQueryBuilder来构建查询条件,支持或逻辑(匹配任意一个值)和与逻辑(同时匹配所有值):
QueryManager queryManager = client.newQueryManager(); StructuredQueryBuilder qb = new StructuredQueryBuilder(); // 示例1:匹配<code>为code1 或 code2的文档 StructuredQueryDefinition orQuery = qb.or( qb.value(qb.element("code"), "code1"), qb.value(qb.element("code"), "code2") ); // 示例2:匹配同时包含<code>为code1 和 code2的文档 // StructuredQueryDefinition andQuery = qb.and( // qb.value(qb.element("code"), "code1"), // qb.value(qb.element("code"), "code2") // );
3. 执行查询并处理结果
// 执行查询,用SearchHandle接收结果 SearchHandle resultsHandle = queryManager.search(orQuery, new SearchHandle()); // 遍历匹配的文档,提取对应的datavalue XMLDocumentManager docManager = client.newXMLDocumentManager(); for (MatchDocumentSummary summary : resultsHandle.getMatchResults()) { DOMHandle contentHandle = new DOMHandle(); docManager.read(summary.getUri(), contentHandle); // 提取当前文档的所有datavalue元素 NodeList datavalueNodes = contentHandle.get().getElementsByTagName("datavalue"); for (int i = 0; i < datavalueNodes.getLength(); i++) { Element datavalue = (Element) datavalueNodes.item(i); String code = datavalue.getElementsByTagName("code").item(0).getTextContent(); String value = datavalue.getElementsByTagName("value").item(0).getTextContent(); System.out.printf("找到匹配项:Code=%s, Value=%s%n", code, value); } } // 记得关闭客户端 client.release();
场景2:根据单个键获取关联的所有多值
比如你要根据<datatypename>的值(比如datatypename1),查询对应的所有<datavalue>(也就是单个键关联的多值集合),代码核心部分如下:
// 构建查询:匹配datatypename为datatypename1的文档 StructuredQueryDefinition query = qb.value( qb.element("datatypename"), "datatypename1" ); // 执行查询后,提取该文档的所有datavalue,这就是该键对应的多值集合 SearchHandle resultsHandle = queryManager.search(query, new SearchHandle()); if (resultsHandle.getTotalResults() > 0) { MatchDocumentSummary firstMatch = resultsHandle.getMatchResults()[0]; DOMHandle contentHandle = new DOMHandle(); docManager.read(firstMatch.getUri(), contentHandle); // 提取所有datavalue并输出 NodeList datavalueNodes = contentHandle.get().getElementsByTagName("datavalue"); System.out.println("datatypename1对应的所有值:"); for (int i = 0; i < datavalueNodes.getLength(); i++) { Element datavalue = (Element) datavalueNodes.item(i); String code = datavalue.getElementsByTagName("code").item(0).getTextContent(); String value = datavalue.getElementsByTagName("value").item(0).getTextContent(); System.out.printf("- Code: %s, Value: %s%n", code, value); } }
关键注意事项
为了让查询更高效,建议在MarkLogic管理控制台给<code>、<datatypename>这些需要查询的元素配置元素值索引:
- 进入MarkLogic管理控制台 → 数据库 → 你的数据库 → 索引
- 添加元素值索引,指定元素名(比如
code、datatypename),选择对应的数据类型(比如字符串)
这样MarkLogic会提前建立索引,大幅提升多值查询的性能。
内容的提问来源于stack exchange,提问作者marklogic_coder
相关产品推荐
相关产品推荐

