MarkLogic sql S1 сопоставление показывает неправильные значения - PullRequest
0 голосов
/ 27 ноября 2018

Позволяет иметь довольно простую схему TDE:

<tde:template xmlns:tde='http://marklogic.com/xdmp/tde'>
  <tde:description>testing a TDE view</tde:description>
  <tde:context>/test</tde:context>
  <tde:enabled>true</tde:enabled>
  <tde:rows>
    <tde:row>
      <tde:schema-name>sitefusion</tde:schema-name>
      <tde:view-name>test</tde:view-name>
      <tde:columns>
        <tde:column>
          <tde:name>name</tde:name>
          <tde:scalar-type>string</tde:scalar-type>
          <tde:val>name</tde:val>
          <tde:nullable>false</tde:nullable>
          <tde:collation>http://marklogic.com/collation/en/S1</tde:collation>
        </tde:column>
      </tde:columns>
    </tde:row>
  </tde:rows>
</tde:template>

Эта схема имеет параметры сортировки http://marklogic.com/collation/en/S1, означающие, что она case and diacritic insensitive.Имея это в виду, я вставил тестовый документ с именем верхнего регистра в верхнем регистре Test:

let $doc := 
<test>
  <name>Test</name>
</test>
return xdmp:document-insert("/test/1.xml", $doc);

let $data := xdmp:sql("select name from test")

return json:array-pop($data)[2];

Результатом этого xquery является ожидаемое значение имени Test.

Теперь давайте обновим name и поместим в него строчную букву test:

let $doc := 
<test>
  <name>test</name>
</test>
return xdmp:document-insert("/test/1.xml", $doc);

let $data := xdmp:sql("select name from test")

return (
   json:array-pop($data)[2], 
   doc("/test/1.xml")
)

Это по некоторым причинам теперь также выводит Test с заглавной буквы T.Почему это так?Вывод doc("/test/1.xml") показывает правильный документ:

<test>
      <name>test</name>
</test>

Это правильное поведение?Влияет ли сопоставление не только на сравнение (как в предложении where), но и на прием пищи?Есть ли способ получить данные с учетом регистра и сравнение без учета регистра?

Редактировать: Использование MarkLogic 9.0-7.2.

1 Ответ

0 голосов
/ 28 ноября 2018

Это происходит потому, что тройной индекс хранит уникальные значения в словаре значений для сжатия.Так как "test" и "Test" считаются равными при сопоставлении, в словаре значений будет сохранено только одно из значений - в данном случае "Test".

Используя сортировку без учета регистра и диакритического знака, выфактически говоря, что вас не волнуют различие в регистре и диакритические знаки.Это означает, что вам не нужно заботиться о падежах или диакритических знаках, используемых в значениях, возвращаемых из этого столбца.

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

...