Marklogic 通过客户端javaapi的动态选项

Marklogic 通过客户端javaapi的动态选项,marklogic,marklogic-8,Marklogic,Marklogic 8,我正在创建RESTWebService,它通过url获取参数,并基于这些动态参数在marklogic中搜索 q=搜索和偏移=0&限制=10&排序=文档ID | asc&术语聚合=组:10 我正在使用StructuredQueryDefinition和RawCombinedQueryDefinition创建: StructuredQueryDefinition queryCriteria = sqb.or(query, sqb.properties(sqb.term(parameters.getQ

我正在创建RESTWebService,它通过url获取参数,并基于这些动态参数在marklogic中搜索

q=搜索和偏移=0&限制=10&排序=文档ID | asc&术语聚合=组: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));
StructuredQueryDefinition queryCriteria=sqb.or(query,sqb.properties(sqb.term(parameters.getQuery)));
String combinedQuery=“”+queryCriteria.serialize()+options+”;
RawCombinedQueryDefinition rawCombinedQuery=queryMgr.newRawCombinedQueryDefinition(新StringHandle(combinedQuery));
为了创建带有选项的查询,我将使用字符串/字符串缓冲区,如用于选项提取文档数据

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>");
extractedDataOption.append(“”)
循环遍历每个字段
{extractedDataOption.append(“/”);
extractedDataOption.append(field_attributes.get(“fieldname”));
extractedDataOption.append(“”);
}   
extractedDataOption.append(“”);
与排序、面、过滤器约束类似

我不能使用持久化查询作为排序参数,facets和过滤器基于webservice请求参数

此外,我看到QueryOptionsBuilder和其他类似的类被弃用

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


谢谢

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

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

下面是一个使用XMLStreamWriter构建选项XML,然后将其序列化为字符串(由中的片段组合而成)的示例

    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");