gpt4 book ai didi

java - 使用 StructuredQueryBuilder 指定动态排序顺序

转载 作者:行者123 更新时间:2023-12-01 16:57:05 29 4
gpt4 key购买 nike

当将 MarkLogic 7 与 Java 客户端 API 结合使用时,我当前正在将查询定义从 StringQueryDefinition 移动到 StructuredQueryDefinition,从而允许我构建和操作以编程方式查询。

通过字符串查询,我能够成功地将排序运算符与 sort:{my-sort-order} 结合使用,该运算符又引用查询选项中指定的预定义订单的名称 ( https://docs.marklogic.com/guide/search-dev/query-options#id_30002 ),但找不到 API 文档相关的方法,允许我使用结构化查询生成器指定排序顺序。

使用 StructuredQueryDefinition 时指定排序顺序的推荐方法是什么?

更新根据 Erik 的提议,这就是代码片段当前的样子,但它并不能解决问题,因为 operator-state 必须作为 query 的子项> 元素而不是 search 元素上的子元素:

    RawStructuredQueryDefinition queryDef = qb.build(qb.and(qb.term(..), qb.rangeConstraint(...)));
String sorting = "<operator-state><operator-name>sort</operator-name><state-name>" + orderBy + "</state-name></operator-state>";
String combi = "<search xmlns='http://marklogic.com/appservices/search'>" + queryDef.toString() + sorting + "</search>";
RawCombinedQueryDefinition combinedQueryDef = queryManager.newRawCombinedQueryDefinition(new StringHandle(combi), OPTIONS);
// DOES NOT WORK, but will lead to MarkLogicIOException "Could not construct search results: parser error"
// Possible solution is to modify the queryDef DOM your own

最佳答案

我们使用了<options> <search> 的标签元素发送到服务器。这需要一个丑陋的字符串连接,但除了排序属性上的索引之外,它不需要服务器端的任何内容。

有关 XML 的格式,请参阅此链接或 search.xsd : http://docs.marklogic.com/guide/rest-dev/appendixb#id_33716

这个想法是生成一个像这样的 XML:

<search xmlns='http://marklogic.com/appservices/search'>
<query xmlns="http://marklogic.com/appservices/search">
<collection-query>
<uri>a_collection</uri>
</collection-query>
</query>
<options>
<sort-order type="xs:dateTime" direction="descending">
<json-property>a_field</json-property>
</sort-order>
</options>
</search>

我们是这样做的:

  1. 首先,构建您的 StructuredQueryDefinition

    StructuredQueryDefinition queryDef = sb.collection("my_collection);
  2. 构建 <options>上面看到的元素

    String xmlSortNode =
    " <options>" +
    " <sort-order type=\"xs:dateTime\" direction=\"descending\">" +
    " <json-property>a_field</json-property>" +
    " </sort-order>" +
    " </options>";
  3. 构建完整的 search元素

    String searchXml="<search xmlns='http://marklogic.com/appservices/search'>"
    + queryDef.serialize()
    + xmlSortNode
    + "</search>";
  4. 执行查询

    queryManager.newRawCombinedQueryDefinition(new StringHandle(searchXml),"all");

关于java - 使用 StructuredQueryBuilder 指定动态排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31162556/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com