抱歉,这可能是一个愚蠢的问题,但我无法在MarkLogic的文档中找到它:
我选择了某些系列中的所有商品,并希望先获得最新商品。所以我正在寻找一些能够对搜索结果进行排序的能力。我通过XQuery看到它是可能的,但是无法在Java API中找到它。
总而言之,我的问题是:
更新
正如@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)?
答案 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}}没有例子,但使用它应该非常简单。