marklogic - 通过 client-java-api 的动态选项

标签 marklogic marklogic-8

我正在创建 REST Web 服务,它通过 url 获取参数并根据这些动态参数在 marklogic 中进行搜索。

q=search&offset=0&limit=10& sort=documentId|asc&termAggregations=group:10

我正在使用 StructuredQueryDefinition 和 RawCombinedQueryDefinition 创建:

StructuredQueryDefinition queryCriteria = sqb.or(query, sqb.properties(sqb.term(parameters.getQuery))));
String combinedQuery = "<search xmlns=\"http://marklogic.com/appservices/search\">"             + queryCriteria.serialize() + options + "</search>";
RawCombinedQueryDefinition rawCombinedQuery = queryMgr.newRawCombinedQueryDefinition( new StringHandle(combinedQuery));

为了使用选项创建查询,我使用 String/String Buffer 就像选项 extract-document-data

extractedDataOption.append("<extract-document-data selected=\"include\">")
Loop through each field 

{   extractedDataOption.append("<extract-path ");
    extractedDataOption.append(" xmlns:");
    extractedDataOption.append(field_attributes.get("namespace"));
    extractedDataOption.append(" >//");
    extractedDataOption.append(field_attributes.get("fieldname"));
    extractedDataOption.append(" </extract-path>");
}   
extractedDataOption.append("</extract-document-data>");

排序、构面、过滤器约束也类似。

我无法使用持久查询,因为排序、构面和过滤器的参数基于 Web 服务请求参数。

此外,我发现 QueryOptionsBuilder 和其他类似的类已被弃用。

有人可以告诉我动态创建这些不同选项而不是字符串的最佳方法吗?

谢谢

最佳答案

当您的选项非常简单或静态时,字符串可以正常工作。但是,如果您正在构建复杂或动态的 XML 结构,我认为明智的做法是寻求不太可能意外生成格式错误的 XML 的结构。 Java 的 XML 构建器库很流行,并且 Java 客户端 API 直接支持几个好的库:Jackson , JDOM , DOM4J , XOM , DOM ,和JAXB 。选择你最喜欢的。

此外,还有一些 XML 构建器可以创建输入流或字符串,因此可以使用 StringHandle 来支持。或InputStreamHandle .

下面是使用 XMLStreamWriter 构建选项 XML,然后将其序列化为字符串(由 CombinedQueryBuilderTest.java 中的片段拼凑而成)的示例。

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    XMLOutputFactory factory = XMLOutputFactory.newInstance();
    factory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true);

    XMLStreamWriter writer = factory.createXMLStreamWriter(out, "UTF-8");
    writer.setDefaultNamespace("http://marklogic.com/appservices/search");
    writer.writeStartElement("options");
        writer.writeStartElement("search-option");
            writer.writeCharacters("filtered");
        writer.writeEndElement();
    writer.writeEndElement();
    return baos.toString("UTF-8");

关于marklogic - 通过 client-java-api 的动态选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35047372/

相关文章:

json - 需要在 MarkLogic 上编写 JSON 查询

javascript - 细化 MarkLogic 查询

marklogic - 使用Java API对MarkLogic中的json文档进行补丁更新操作

gradle - 通过ml-gradle为同一模块创建多个MarkLogic调度任务

xquery - 使用 XQuery 标准化 XML 每个元素中的空间

xquery - 元素值查询与元素范围查询的性能

xquery - 派生函数中的last()

marklogic - 我们可以在 MarkLogic 的 Optic API 查询中使用 DATEADD 函数吗

xquery - Marklogic Xquery fn :data(<type>hello world</type>) giving Invalid lexical value error

marklogic - MarkLogic 8-按路径索引排序