【问题标题】:Dynamic options via client-java-api通过 client-java-api 的动态选项
【发布时间】:2016-01-27 20:27:27
【问题描述】:

我正在创建 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 和其他类似的类已被弃用。

谁能告诉我动态创建这些不同选项而不是字符串的最佳方法是什么?

谢谢

【问题讨论】:

    标签: marklogic marklogic-8


    【解决方案1】:

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

    此外,还有一些 XML 构建器可以创建 InputStream 或 String,因此可以使用 StringHandleInputStreamHandle 来支持。

    这是一个使用 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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 2012-09-07
      • 1970-01-01
      相关资源
      最近更新 更多