Индекс диапазона ограничений для элементов в документах в определенной коллекции
Мы создаем корпоративное приложение с ML в качестве бэк-энда. Многие экраны в приложении имеют выпадающие списки, которые требуют определенных значений элементов внутри документов. Таким образом, мы создали индекс диапазона элементов для этих элементов и подготовили код для получения различных значений с использованием индекса диапазона.
Теперь мы логически разделяем документы на разные коллекции - например, коллекцию "basedata", которая содержит все документы базы данных приложения, и коллекцию "TransactionsData", которая хранит все входящие / исходящие транзакции для нашего приложения.
Теперь требуется ограничить индекс диапазона только документами сбора базовых данных, а не документами транзакционных данных.
Например: если у нас есть индекс диапазона элементов для localname="entityName", мы не хотим, чтобы индекс диапазона строился для значений entityName, присутствующих в документах при сборе транзакционных данных. Мы хотим, чтобы различные значения "entityName" встречались только в документах, прикрепленных к коллекции basedata.
Как мы можем достичь этого?
Редактировать:
Спасибо Дэвид и Гртйн.
Это то, что мы в настоящее время делаем на уровне Java: приведенный ниже код правильно возвращает отличительные имена для поля entityName, для которого создан индекс диапазона.
String valueOptionString =
" <search:options xmlns:search="http://marklogic.com/appservices/search">
<search:values name="entityName">
<search:range type="xs:string">
<search:element name="entityName">
</search:element>
</search:range>
</search:values>
</search:options> ";
QueryManager queryMgr = client.newQueryManager();
QueryOptionsManager optionsMgr = client.newServerConfigManager().newQueryOptionsManager();
optionsMgr.writeOptions("DistinctValues", new StringHandle(valueOptionString));
ValuesDefinition vdef = queryMgr.newValuesDefinition("entityName", "DistinctValues");
ValuesHandle vh = queryMgr.values(vdef, new ValuesHandle());
for (CountedDistinctValue value : vh.getValues()) {
System.out.println("Distinct value is :: " +
value.get("xs:string", String.class));
}
Как вы можете видеть, я нигде не устанавливаю коллекцию в queryMgr.values (); основываясь на предложенном предложении, я пытался добавить ограничение коллекции в valueOptionString, но оно не работает. Это правильный подход? Есть ли другой выход
<search:options xmlns:search="http://marklogic.com/appservices/search">
<search:values name="createdBy">
<search:range type="xs:string">
<search:element name="createdBy"/>
</search:range>
<search:collection>
<search:uri>basedaata</search:uri>
<search:uri>tansactiondata</search:uri>
</search:collection>
</search:values>
</search:options>
Обнаружена ошибка:
Local message: /config/query write failed: Bad Request. Server Message: RESTAPI-INVALIDCONTENT: (err:FOER0000) Invalid content: Op
eration results in invalid Options: XDMP-VALIDATEUNEXPECTED: (err:XQDY0027) validate strict { $opt } -- Invalid node: Found text{"basedaata..."} but expected () at fn:doc("")
РЕДАКТИРОВАТЬ 2:
Основываясь на приведенных ниже ответах, я обновил свой код, добавив в дополнительный запрос раздел "дополнительный запрос", чтобы он содержал возвращаемые значения. Однако, похоже, что дополнительная часть запроса игнорируется и не работает должным образом
Обновлен необязательный запрос:
<search:options xmlns:search="http://marklogic.com/appservices/search">
<search:values name="entityName">
<search:range type="xs:string">
<search:element name="entityName"/>
</search:range>
</search:values>
<search:additional-query>
<cts:collection-query xmlns:cts="http://marklogic.com/cts">
<cts:uri>basedata</cts:uri>
<cts:uri>DistinctValueTest</cts:uri>
</cts:collection-query>
</search:additional-query>
</search:options>
Ниже приведены документы, которые у меня есть. Также у меня есть индекс диапазона элементов на поле entityName..
Документ в коллекции basedata:
<?xml version="1.0" encoding="UTF-8"?>
<entity>
<entityName>Company</entityName>
<createdBy>CompanyOwner</createdBy>
<createdDate>2017-01-01T05:56:35.360Z</createdDate>
<status>Active</status>
<entityattributes>
<entityattribute>
</entityattribute>
</entityattributes>
</entity>
Теперь создали тестовую коллекцию с именем DistinctValueTest и добавили документ для целей тестирования в эту коллекцию.
Документ в коллекции DistinctValueTest:
<?xml version="1.0" encoding="UTF-8"?>
<entity>
<entityName>DistinctValueTestEntity</entityName>
<createdBy>DistinctValuteSystemNew</createdBy>
<createdDate>2017-01-03T05:56:35.360Z</createdDate>
<status>Active</status>
<entityattributes>
<entityattribute>
</entityattribute>
</entityattributes>
</entity>
Вывод программы: Company,DistinctValueteSystemNew, когда обе коллекции предоставлены в дополнительном разделе запроса
<cts:collection-query xmlns:cts="http://marklogic.com/cts">
<cts:uri>basedata</cts:uri>
<cts:uri>DistinctValueTest</cts:uri>
</cts:collection-query
Однако, если я только предоставляю коллекцию "basedata" в cts:uri, он по-прежнему показывает выходные данные как Company, DistinctValueteSystemNew, а не просто Company
<cts:collection-query xmlns:cts="http://marklogic.com/cts">
<cts:uri>basedata</cts:uri>
</cts:collection-query
2 ответа
Вместо создания нескольких индексов для каждой комбинации критериев вы объединяете индексы при чтении. cts:values
Функция принимает 4-й параметр, представляющий запрос, который обрезает фрагменты, из которых будут получены значения. В вашем случае это будет выглядеть примерно так:
cts:values(
cts:element-reference(xs:QName("entityName")),
(),
(),
cts:collection-query("basedata")
)
Подобные эффекты могут быть достигнуты с немного более абстрактным search:values
функция и /v1/values
Конечные точки ОТДЫХА.
НТН!
Основываясь на ответе grtjn и вашем обновленном вопросе, простой способ ограничить значения, возвращаемые вами в конкретную коллекцию, заключается в добавлении дополнительного запроса к вашим опциям.
<search:options xmlns:search="http://marklogic.com/appservices/search">
<search:values name="createdBy">
<search:range type="xs:string">
<search:element name="createdBy"/>
</search:range>
</search:values>
<search:additional-query>
<cts:collection-query xmlns:cts="http://marklogic.com/cts">
<cts:uri>basedata</cts:uri>
<cts:uri>transactiondata</cts:uri>
</cts:collection-query>
</search:additional-query>
</search:options>
additional-query
добавляется в каждый запрос с этим набором параметров.