如何搜索除Marklogic中的记录之外的所有目录中的记录

时间:2017-04-18 12:57:10

标签: search directory marklogic

我正在尝试使用marklogic-java api在我的数据库中搜索XML,但有以下限制:

1)特定的XML标签必须包含我给定的ex值:tradeId必须等于我传递的值

2)结果必须在我提供的收藏中

3)结果可以位于marklogic数据库中的任何位置,但在一个特定目录中除外

我没有解决方案指向3.满足我的前两个条件的记录很少有一个以/ TRADES / *开头的URI,因此我想搜索除目录之外的所有地方" / TRADES& #34;

这是我的代码的外观:

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;
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

我没有看到通过示例语法在查询中撰写元数据(目录)查询的选项。因此,您必须使用结构化查询。我发现它们在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);