使用组合 cts 查询的数据移动管理器
Data Movement Manager using combined cts queries
我想使用组合搜索查询,例如 here 和 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>
使用简单的 QueryManager
,这 returns 我的总数,假设是 50。
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 似乎根本没有使用我的查询过滤器:
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
代码并注意到了 this call。
UrisHandle results = queryMgr.uris(query, handle, start, null, forest.getForestName())
这是对内部 api 的调用,以便为 onUrisReady 侦听器获取所有 uris。这似乎没有使用组合的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 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
- 马克逻辑:9.0-6
一旦测试确认实施,此错误的修复将出现在未来的版本中。
这是 GitHub 存储库中的问题:
我想使用组合搜索查询,例如 here 和 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>
使用简单的 QueryManager
,这 returns 我的总数,假设是 50。
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 似乎根本没有使用我的查询过滤器:
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
代码并注意到了 this call。
UrisHandle results = queryMgr.uris(query, handle, start, null, forest.getForestName())
这是对内部 api 的调用,以便为 onUrisReady 侦听器获取所有 uris。这似乎没有使用组合的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 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
- 马克逻辑:9.0-6
一旦测试确认实施,此错误的修复将出现在未来的版本中。
这是 GitHub 存储库中的问题: