首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用组合cts查询的数据移动管理器

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

Stack Overflow用户
提问于 2018-09-19 09:12:57
回答 1查看 97关注 0票数 0

我想使用一个合并的搜索查询,比如文档化的这里和一个QueryBatcher。但我似乎没有得到预期的结果。我的查询是这样的:

代码语言:javascript
运行
复制
<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>

使用一个简单的QueryManager,它返回给我一个总数,嗯,假设是50。

代码语言:javascript
运行
复制
final QueryManager qMngr = client.newQueryManager();

final RawStructuredQueryDefinition query = qMngr.newRawStructuredQueryDefinition(new StringHandle().with("" +
       "<search xmlns=\"http://marklogic.com/appservices/search\" xmlns:cts=\"http://marklogic.com/cts\">" +
       "   <cts:element-word-query xmlns:cts=\"http://marklogic.com/cts\"><cts:element>id</cts:element><cts:text>2</cts:text></cts:element-word-query>" +
        "</search>").withFormat(Format.XML)
        );
// prints 50
System.out.println("Count by search: "+ qMngr.search(query, new SearchHandle()).getTotalResults());

使用带有此查询的QueryBatcher,我将得到数据库中的每个文档。QueryBatcher似乎根本不使用我的查询筛选器:

代码语言:javascript
运行
复制
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代码,一个被注意到的这个电话

代码语言:javascript
运行
复制
UrisHandle results = queryMgr.uris(query, handle, start, null, forest.getForestName())

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

代码语言:javascript
运行
复制
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);

编辑:将组合查询与结构化查询结合使用实际上有效,但遗憾的是,我不能这样做:

代码语言:javascript
运行
复制
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)

这是已知的窃听器还是我做错了什么?

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-19 16:54:56

一旦测试确认了实现,该bug的修复将出现在未来的版本中。

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

https://github.com/marklogic/java-client-api/issues/965

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52402242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档