java - 使用 Java 客户端 API 在 MarkLogic 中获取所有文档 URI

标签 java marklogic

我试图在不知道确切 url 的情况下从数据库中获取所有文档。我有一个问题

DocumentPage documents =docMgr.read();
while (documents.hasNext()) {
    DocumentRecord document = documents.next();
    System.out.println(document.getUri());
}

但是我没有具体的url,我想要所有的文件

最佳答案

第一步是在数据库上启用您的 uris 词典。

您可以评估一些 XQuery 并运行 cts:uris()(或服务器端 JS 并运行 cts.uris()):

    ServerEvaluationCall call = client.newServerEval()
        .xquery("cts:uris()");
    for ( EvalResult result : call.eval() ) {
        String uri = result.getString();
        System.out.println(uri);
    }

两个缺点是:(1) 您需要一个 privileges 的用户(2) 没有分页。

如果您的文档数量较少,则不需要分页。但对于大量文档,建议分页。下面是一些使用搜索 API 和分页的代码:

    // do the next eight lines just once
    String options =
        "<options xmlns='http://marklogic.com/appservices/search'>" +
        "  <values name='uris'>" +
        "    <uri/>" +
        "  </values>" +
        "</options>";
    QueryOptionsManager optionsMgr = client.newServerConfigManager().newQueryOptionsManager();
    optionsMgr.writeOptions("uriOptions", new StringHandle(options));

    // run the following each time you need to list all uris
    QueryManager queryMgr = client.newQueryManager();
    long pageLength = 10000;
    queryMgr.setPageLength(pageLength);
    ValuesDefinition query = queryMgr.newValuesDefinition("uris", "uriOptions");
    // the following "and" query just matches all documents
    query.setQueryDefinition(new StructuredQueryBuilder().and());
    int start = 1;
    boolean hasMore = true;
    Transaction transaction = client.openTransaction();
    try {
        while ( hasMore ) {
            CountedDistinctValue[] uriValues =
                queryMgr.values(query, new ValuesHandle(), start, transaction).getValues();
            for (CountedDistinctValue uriValue : uriValues) {
                String uri = uriValue.get("string", String.class);
                //System.out.println(uri);
            }
            start += uriValues.length;
            // this is the last page if uriValues is smaller than pageLength
            hasMore = uriValues.length == pageLength;
        }
    } finally {
        transaction.commit();
    }

只有当您需要一个与此过程同时发生的添加/删除隔离的有保证的“快照”列表时,才需要事务。由于它会增加一些开销,如果您不需要这种精确性,请随时将其删除。

关于java - 使用 Java 客户端 API 在 MarkLogic 中获取所有文档 URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33234277/

相关文章:

java - 使用 java 和 Node.js 服务器上传。请求文件为空

java - 使 Thymeleaf 为 :field consume Lombok-generated boolean getter

java - 线程优先级

marklogic - 带有 xsi :noNamespaceSchemaLocation 的片段根上的 XDMP-PARENTLINK 错误

XQuery 基于 xml 结构创建 where 子句作为一种动态 where 子句

marklogic - MarkLogic 中的同义词搜索

java - 在线程中调用run方法

java - 明星算法,异常行为

machine-learning - RDF 存储上的机器学习来检测模式

web-applications - MarkLogic/NoSQL/NewSQL 和 Web 应用程序框架 - 新应用程序的架构