如何在Marklogic中搜索除一个目录外的所有目录中的记录
How to search records in all directory except one in Marklogic
我正在尝试使用 marklogic-java api 在我的数据库中搜索 XML,但有以下限制:
1) 特定的 XML 标签必须包含我给定的 ex 值:tradeId 必须等于我传递的值
2) 结果必须在我提供的集合中
3) 结果可以位于 marklogic 数据库中的任何位置,特定目录除外
我没有第 3 点的解决方案。满足我的前两个条件的记录中很少有 URI 以 /TRADES/* 开头,所以我想搜索除目录“/TRADES”之外的所有地方。
我的代码是这样的:
public static List<DocumentPage> getResults() throws KeyManagementException, NoSuchAlgorithmException,
KeyStoreException, CertificateException, IOException {
String tradeId = "XYZ";
DatabaseClient client = getDBClient();
QueryManager queryMgr = client.newQueryManager();
XMLDocumentManager xmlMngr = client.newXMLDocumentManager();
StringHandle rawHandle = new StringHandle();
rawHandle.withFormat(Format.XML).set(getQueryToFetchMessagesByTradeId(tradeId));
RawQueryByExampleDefinition querydef = queryMgr.newRawQueryByExampleDefinition(rawHandle);
querydef.setCollections("/messages/processed", /messages/toBeProcessed");
querydef.setDirectory("/");
return getDocumentPageList(querydef, client);
}
private static String getQueryToFetchMessagesByTradeId(String tradeId) {
String query = "<q:qbe xmlns:q=\"http://marklogic.com/appservices/querybyexample\">\n" + "<q:query>\n<q:word>"
+ "<tradeId tradeIdScheme=" + "\"http://www.abcd.com/internalid/trade-id\"" + ">" + tradeId
+ "</tradeId></q:word>\n" + "</q:query>\n" + "</q:qbe>";
return query;
}
非常感谢任何帮助。
我没有看到在按示例语法查询中编写元数据(目录)查询的选项。所以你必须改用结构化查询。无论如何,我发现它们在 Java 中更具可读性,因为它们不需要字符串连接。像这样使用 StructuredQueryBuilder:
StructuredQueryBuilder qb = new StructuredQueryBuilder();
StructuredQueryDefinition querydef =
qb.and(
qb.containerQuery(
qb.element(new QName("http://www.abcd.com/internalid/trade-id", "tradeId")),
qb.and(
qb.term( tradeId ),
qb.value(
qb.elementAttribute(
qb.element(new QName("http://www.abcd.com/internalid/trade-id", "tradeId")),
qb.attribute("tradeIdScheme")
),
"http://www.abcd.com/internalid/trade-id"
)
)
),
qb.not(
qb.directory(1, "/TRADES/")
)
);
querydef.setCollections("/messages/processed", "/messages/toBeProcessed")
return getDocumentPageList(querydef, client);
我正在尝试使用 marklogic-java api 在我的数据库中搜索 XML,但有以下限制:
1) 特定的 XML 标签必须包含我给定的 ex 值:tradeId 必须等于我传递的值
2) 结果必须在我提供的集合中
3) 结果可以位于 marklogic 数据库中的任何位置,特定目录除外
我没有第 3 点的解决方案。满足我的前两个条件的记录中很少有 URI 以 /TRADES/* 开头,所以我想搜索除目录“/TRADES”之外的所有地方。
我的代码是这样的:
public static List<DocumentPage> getResults() throws KeyManagementException, NoSuchAlgorithmException,
KeyStoreException, CertificateException, IOException {
String tradeId = "XYZ";
DatabaseClient client = getDBClient();
QueryManager queryMgr = client.newQueryManager();
XMLDocumentManager xmlMngr = client.newXMLDocumentManager();
StringHandle rawHandle = new StringHandle();
rawHandle.withFormat(Format.XML).set(getQueryToFetchMessagesByTradeId(tradeId));
RawQueryByExampleDefinition querydef = queryMgr.newRawQueryByExampleDefinition(rawHandle);
querydef.setCollections("/messages/processed", /messages/toBeProcessed");
querydef.setDirectory("/");
return getDocumentPageList(querydef, client);
}
private static String getQueryToFetchMessagesByTradeId(String tradeId) {
String query = "<q:qbe xmlns:q=\"http://marklogic.com/appservices/querybyexample\">\n" + "<q:query>\n<q:word>"
+ "<tradeId tradeIdScheme=" + "\"http://www.abcd.com/internalid/trade-id\"" + ">" + tradeId
+ "</tradeId></q:word>\n" + "</q:query>\n" + "</q:qbe>";
return query;
}
非常感谢任何帮助。
我没有看到在按示例语法查询中编写元数据(目录)查询的选项。所以你必须改用结构化查询。无论如何,我发现它们在 Java 中更具可读性,因为它们不需要字符串连接。像这样使用 StructuredQueryBuilder:
StructuredQueryBuilder qb = new StructuredQueryBuilder();
StructuredQueryDefinition querydef =
qb.and(
qb.containerQuery(
qb.element(new QName("http://www.abcd.com/internalid/trade-id", "tradeId")),
qb.and(
qb.term( tradeId ),
qb.value(
qb.elementAttribute(
qb.element(new QName("http://www.abcd.com/internalid/trade-id", "tradeId")),
qb.attribute("tradeIdScheme")
),
"http://www.abcd.com/internalid/trade-id"
)
)
),
qb.not(
qb.directory(1, "/TRADES/")
)
);
querydef.setCollections("/messages/processed", "/messages/toBeProcessed")
return getDocumentPageList(querydef, client);