Диспетчер перемещения данных, использующий комбинированные cts-запросы - PullRequest
0 голосов
/ 19 сентября 2018

Я хотел использовать комбинированный поисковый запрос, подобный тому, который задокументирован здесь с 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, я получаю общее количество, ну скажем, 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 закодировал замеченный этот вызов .

UrisHandle results = queryMgr.uris(query, handle, start, null, forest.getForestName())

Это вызов внутреннего API, чтобы получить весь Uris для слушателя onUrisReady.Кажется, это не использует комбинированный запрос 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
  • MarkLogic: 9.0-6

1 Ответ

0 голосов
/ 19 сентября 2018

Исправление для этой ошибки появится в будущем выпуске, как только тестирование подтвердит реализацию.

Вот проблема в репозитории GitHub:

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

...