通过客户端的动态选项-java-api
Dynamic options via client-java-api
我正在创建通过 url 获取参数的 REST 网络服务,并根据这些动态参数在 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>");
对于排序、构面、过滤器约束也类似。
我不能使用持久查询作为排序参数,构面和过滤器基于网络服务请求参数。
另外,我看到 QueryOptionsBuilder 和其他类似的 类 已被弃用。
谁能告诉我动态创建这些不同选项而不是字符串的最佳方法是什么?
谢谢
当您的选项非常简单或静态时,字符串可以正常工作。但是,如果您正在构建一个复杂或动态的 XML 结构,我认为您明智的做法是寻找不太可能意外产生 mal-formed XML 的东西。 XML Java 的构建器库很流行,Java 客户端 API:Jackson, JDOM, DOM4J, XOM, DOM, and JAXB 直接支持几个不错的构建器库。选择你最喜欢的。
此外,还有 XML 个创建 InputStream 或 String 的构建器,因此可以使用 StringHandle or 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");
我正在创建通过 url 获取参数的 REST 网络服务,并根据这些动态参数在 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>");
对于排序、构面、过滤器约束也类似。
我不能使用持久查询作为排序参数,构面和过滤器基于网络服务请求参数。
另外,我看到 QueryOptionsBuilder 和其他类似的 类 已被弃用。
谁能告诉我动态创建这些不同选项而不是字符串的最佳方法是什么?
谢谢
当您的选项非常简单或静态时,字符串可以正常工作。但是,如果您正在构建一个复杂或动态的 XML 结构,我认为您明智的做法是寻找不太可能意外产生 mal-formed XML 的东西。 XML Java 的构建器库很流行,Java 客户端 API:Jackson, JDOM, DOM4J, XOM, DOM, and JAXB 直接支持几个不错的构建器库。选择你最喜欢的。
此外,还有 XML 个创建 InputStream 或 String 的构建器,因此可以使用 StringHandle or 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");