Индекс диапазона ограничений для элементов в документах в определенной коллекции

Мы создаем корпоративное приложение с 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 добавляется в каждый запрос с этим набором параметров.

Другие вопросы по тегам