我正在创建REST webservice,它通过url获取参数,并根据这些动态参数在marklogic中搜索。
Q =搜索和安培;偏移= 0&安培;限制= 10&安培;排序= documentId | ASC&安培; termAggregations =基团: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>");
类似于排序,构面,过滤器约束。
我不能将持久化查询用作sort,facets&amp;的参数。过滤器基于Web服务请求参数。
另外,我看到QueryOptionsBuilder和其他类似的类已被弃用。
有人可以告诉我什么是动态创建这些不同选项而不是字符串的最佳方法?
由于
答案 0 :(得分:2)
当您的选项非常简单或静态时,字符串可以正常工作。但是,如果您正在构建复杂或动态的XML结构,我认为您最不可能寻找不太可能意外生成格式错误的XML的东西。用于Java的XML构建器库非常普遍,Java客户端API直接支持几个好的库:Jackson,JDOM,DOM4J,XOM,DOM,和JAXB。选择你最喜欢的。
此外,还有XML Builders可以创建InputStream或String,因此可以使用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");