MarkLogic,java API。获取搜索结果排序

时间:2014-05-11 08:54:45

标签: marklogic

抱歉,这可能是一个愚蠢的问题,但我无法在MarkLogic的文档中找到它:

我选择了某些系列中的所有商品,并希望先获得最新商品。所以我正在寻找一些能够对搜索结果进行排序的能力。我通过XQuery看到它是可能的,但是无法在Java API中找到它。

总而言之,我的问题是:

  1. 是否可以通过Java API获取搜索结果,排序方式为" lastModifyTime" (据我所知 - 它是一些自动创建/更新的字段)?
  2. 是否可以通过我的自定义属性排序的Java API获取搜索结果?
  3. 更新

    正如@mblakele在他的回答中提到的 - 有QueryOptions.QuerySortOrder,它可以用于此目的。我查看了他们的教程,对我来说不是那么简单,如何使用它。

    我在我的数据库中为自己的属性" LAST_MODIFICATION_TIME"创建了范围索引,然后使用以下代码创建了QueryOptions:

    QueryOptionsBuilder qob = new QueryOptionsBuilder();
    RangeSpec rangeSpec = qob.fieldRangeIndex("LAST_MODIFICATION_TIME", qob.rangeType("xs:dateTime"));
    QueryOptions.QuerySortOrder querySortOrder = qob.sortOrder(rangeSpec, QueryOptions.QuerySortOrder.Direction.DESCENDING);
    

    接下来我该怎么办?只需使用以下命令将其写入REST服务器:

    QueryOptionsHandle optsHandle = new QueryOptionsHandle().withSortOrders(querySortOrder);
    databaseClient.newServerConfigManager().newQueryOptionsManager().writeOptions("myConstraintName", optsHandle);
    

    如果是 - 我如何将其用于我的进一步搜索查询(我使用StructuredQueryBuilder)?

2 个答案:

答案 0 :(得分:2)

Search API(以及它上面的REST API和Java API层)只能对返回的片段上的索引进行排序。

MarkLogic确实提供了最后修改的属性,默认情况下该属性处于关闭状态。您可以使用"维护上次修改" Admin UI的数据库配置页面中的复选框。但是,此值存储在属性片段中。因此,在检索文档时,您无法对该属性进行排序。

但是,您可以在编写文档时将最后修改过的元素添加到文档中。文档写入转换提供了一种插入该元素的方法:

http://docs.marklogic.com/guide/java/transforms

然后,您可以在管理界面中的元素上创建日期时间范围索引。

要在搜索时使用范围索引,请首先创建指定排序顺序的查询选项。不推荐使用QueryOptions和QueryOptionsBuilder类,因此最好编写原始查询选项:

http://docs.marklogic.com/guide/java/query-options#id_20346

对于排序,您的查询选项将类似于以下

<search:options xmlns:search="http://marklogic.com/appservices/search">
<search:sort-order type="xs:dateTime" direction="ascending">
  <search:element ns="" name="my-last-modified"/>
</search:sort-order>
</search:options>

顺便说一下,这里描述了完整的查询选项集:

http://docs.marklogic.com/guide/rest-dev/appendixb#id_33716

希望这有用,

Erik Hennum

答案 1 :(得分:1)

您可以使用QueryOptions.QuerySortOrder设置排序顺序。 https://developer.marklogic.com/learn/java/custom-search上的教程解释了如何设置查询选项。 <{1}}没有例子,但使用它应该非常简单。