Marklogic 使用组合cts查询的数据移动管理器

Marklogic 使用组合cts查询的数据移动管理器,marklogic,marklogic-9,Marklogic,Marklogic 9,我想使用一个组合搜索查询,就像用QueryBatcher记录的那样。但我似乎没有得到我预期的结果。 以下是我的查询的外观: <search xmlns="http://marklogic.com/appservices/search" xmlns:cts="http://marklogic.com/cts"> <cts:element-word-query> <cts:element>id</cts:element>

我想使用一个组合搜索查询,就像用
QueryBatcher
记录的那样。但我似乎没有得到我预期的结果。 以下是我的查询的外观:

<search xmlns="http://marklogic.com/appservices/search" xmlns:cts="http://marklogic.com/cts">
    <cts:element-word-query>
        <cts:element>id</cts:element>
        <cts:text>2</cts:text>
    </cts:element-word-query>
</search>
使用带有此查询的QueryBatcher,我将返回数据库中的每个文档。QueryBatcher似乎根本没有使用我的查询过滤器:

DataMovementManager dmm = client.newDataMovementManager();
QueryBatchListener listener = (a) -> System.out.println(a.getItems().length);
QueryBatcher queryBatcher = dmm
    .newQueryBatcher(query)
    .onUrisReady(listener);

dmm.startJob(queryBatcher);
queryBatcher.awaitCompletion();
// prints a few lines with 1000 and a few with some smaller number. 
// But WAY more than expected (50!) using the same query as before
因此,我在那里挖掘了
QueryBatcher
code

这是对内部api的调用,以获取OnUrsReady侦听器的所有URI。这似乎没有使用组合cts查询:

final Iterator<String> iterator = ((QueryManagerImpl) qMngr).uris(query, new UrisHandle(), 0, null, "my-forest").iterator();

int count = 0;
while (iterator.hasNext()) {
   iterator.next();
   count++;
}
// prints 1000
System.out.println("By uris: " + count);
final Iterator Iterator=((QueryManagerImpl)qMngr).uris(查询,新UrisHandle(),0,null,“我的森林”).Iterator();
整数计数=0;
while(iterator.hasNext()){
iterator.next();
计数++;
}
//打印1000张
System.out.println(“按URI:+count”);
编辑: 使用组合查询和结构化查询实际上是可行的,但遗憾的是,我不能使用:

final QueryManager qMngr = client.newQueryManager();
final StructuredQueryBuilder sqb = qMngr.newStructuredQueryBuilder();
final RawStructuredQueryDefinition query = qMngr.newRawStructuredQueryDefinition(new StringHandle().with("" +
        "<search xmlns=\"http://marklogic.com/appservices/search\">" +
            sqb.word(sqb.element("id"), "2").serialize() +
        "</search>").withFormat(Format.XML)
    );

DataMovementManager dmm = client.newDataMovementManager();
QueryBatchListener listener = (a) -> System.out.println(a.getItems().length);
QueryBatcher queryBatcher = dmm
    .newQueryBatcher(query)
    .onUrisReady(listener);

dmm.startJob(queryBatcher);
queryBatcher.awaitCompletion();
// returns 50 (in total, in multiple listener calls)
final QueryManager qMngr=client.newQueryManager();
final StructuredQueryBuilder sqb=qMngr.newStructuredQueryBuilder();
final RawStructuredQueryDefinition query=qMngr.newRawStructuredQueryDefinition(新StringHandle()。带(“”)+
"" +
sqb.word(sqb.element(“id”),“2”).serialize()+
“”)。withFormat(Format.XML)
);
DataMovementManager dmm=client.newDataMovementManager();
QueryBatchListener侦听器=(a)->System.out.println(a.getItems().length);
QueryBatcher QueryBatcher=dmm
.newQueryBatcher(查询)
.onUrisReady(监听器);
dmm.startJob(查询调度器);
queryBatcher.awaitCompletion();
//返回50(总共,在多个侦听器调用中)
这是已知的bug还是我做错了什么

  • Java客户端:4.1.0
  • MarkLogic:9.0-6

一旦测试确认实现,此错误的修复将出现在未来的版本中

以下是GitHub存储库中的问题:


一旦测试确认实现,此错误的修复将出现在未来的版本中

以下是GitHub存储库中的问题:


嗨,Michael,你检查过sqb.word(sqb.element(“id”),“2”).serialize()的计算结果是什么吗?我的想法是,这个构建器只会返回search:query元素,而您得到的可能与原始XML中的cts:query不同。我得到的是相同的行为-StringQueryDefinition和StructuredQueryDefinition都使用QueryBatcher生成正确的结果,但是RawStringQueryDefinition和RawCombinedQueryDefinition都没有忽略查询(我只是使用一个简单的单词查询)。我建议在marklogic客户端api github项目中提交一个bug。这个问题涉及的是QueryBatcher和简单QueryManager搜索的输出差异。使用相同的cts组合查询,QueryBatcher似乎完全忽略了查询筛选器,而QueryManager则没有。@rjrudin marklogic客户端api项目可以解决这个问题吗?我怀疑缺陷在/v1/internal/uris端点中,请参阅queryMgr.uris代码示例。我确实认为这是因为组合查询不受支持(从某种意义上说,它不起作用)。如果可能的话,我强烈建议你解决这个问题。除非在同一个调用中需要搜索选项和搜索,否则我将避免组合查询负载。我只是觉得这是一个很难填补的空白,因为/v1/search上组合查询的处理相当复杂。嗨,Michael,你检查过sqb.word(sqb.element(“id”),“2”).serialize()的计算结果是什么吗?我的想法是,这个构建器只会返回search:query元素,而您得到的可能与原始XML中的cts:query不同。我得到的是相同的行为-StringQueryDefinition和StructuredQueryDefinition都使用QueryBatcher生成正确的结果,但是RawStringQueryDefinition和RawCombinedQueryDefinition都没有忽略查询(我只是使用一个简单的单词查询)。我建议在marklogic客户端api github项目中提交一个bug。这个问题涉及的是QueryBatcher和简单QueryManager搜索的输出差异。使用相同的cts组合查询,QueryBatcher似乎完全忽略了查询筛选器,而QueryManager则没有。@rjrudin marklogic客户端api项目可以解决这个问题吗?我怀疑缺陷在/v1/internal/uris端点中,请参阅queryMgr.uris代码示例。我确实认为这是因为组合查询不受支持(从某种意义上说,它不起作用)。如果可能的话,我强烈建议你解决这个问题。除非在同一个调用中需要搜索选项和搜索,否则我将避免组合查询负载。我只是认为这将是一个很难填补的空白,因为/v1/search上的组合查询处理相当复杂。没有看到这个问题。感谢您的发布。未看到此问题。谢谢你的发帖。
final Iterator<String> iterator = ((QueryManagerImpl) qMngr).uris(query, new UrisHandle(), 0, null, "my-forest").iterator();

int count = 0;
while (iterator.hasNext()) {
   iterator.next();
   count++;
}
// prints 1000
System.out.println("By uris: " + count);
final QueryManager qMngr = client.newQueryManager();
final StructuredQueryBuilder sqb = qMngr.newStructuredQueryBuilder();
final RawStructuredQueryDefinition query = qMngr.newRawStructuredQueryDefinition(new StringHandle().with("" +
        "<search xmlns=\"http://marklogic.com/appservices/search\">" +
            sqb.word(sqb.element("id"), "2").serialize() +
        "</search>").withFormat(Format.XML)
    );

DataMovementManager dmm = client.newDataMovementManager();
QueryBatchListener listener = (a) -> System.out.println(a.getItems().length);
QueryBatcher queryBatcher = dmm
    .newQueryBatcher(query)
    .onUrisReady(listener);

dmm.startJob(queryBatcher);
queryBatcher.awaitCompletion();
// returns 50 (in total, in multiple listener calls)