Агрегаты в Marklogic 8 Java - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь сгруппировать все документы на основе значения элемента.Через X-Query я могу получить значение элемента и соответствующее ему количество.Но с Java API я не могу этого сделать.

X-Query:

for $name in distinct-values(doc()/document/<element_name>)
return fn:concat("Element Value:",$name,", Count:",fn:count(doc()/document/[element_name eq $name]));

Вывод:

Element Value:A, Count:100
Element Value:B, Count:200

Java:

QueryManager qryMgr = client.newQueryManager();
StructuredQueryBuilder qb = new StructuredQueryBuilder();
StructuredQueryDefinition querydef = qb.containerQuery(qb.element("<element_name>"), qb.term("A"));
SearchHandle handle = new SearchHandle();
qryMgr.search(querydef, handle);
System.out.println(handle.getTotalResults());

С помощью этого метода я могу получить количество документов только для определенного значения.Есть ли способ получить количество всех документов.Пожалуйста, помогите!

1 Ответ

0 голосов
/ 06 июня 2018

Если я понимаю ваш вариант использования, вы можете использовать индекс диапазона для решения этой проблемы, а именно - вы хотите знать, каковы все значения для определенного элемента, а затем, сколько документов имеют это значение.Это именно то, для чего предназначен индекс диапазона.

Попробуйте добавить индекс диапазона для «имя_элемента» - для этого вы можете использовать приложение ML Admin - перейдите в свою базу данных и нажмите «Индексы диапазона элементов».

В XQuery вы можете сделать что-то вроде этого:

for $val in cts:element-values(xs:QName("element_name"))
return text{$val, cts:frequency($val)}

С помощью клиента Java вы можете сделать то же самое, добавив ограничение на основе диапазона в файл параметров поиска, итогда ответ от SearchManager будет содержать все значения и частоты, соответствующие вашему запросу.Проверьте документы API REST для создания такого файла параметров поиска.

...