Как создать поле базы данных в Marklogic Server?

У меня есть следующая структура xml

 <patent-assignors>
        <patent-assignor>
          <name>VOLPENHEIN, ROBERT A.</name>
          <execution-date>
        <date>19841204</date>
          </execution-date>
        </patent-assignor>
 </patent-assignors>


    <patent-assignees>
        <patent-assignee>
          <name>PROCTER &amp; GAMBLE COMPANY, THE</name>
          <address-2>A CORP. OF  OHIO</address-2>
          <city>CINCINNATI</city>
          <state>OHIO</state>
        </patent-assignee>
   </patent-assignees>

Я хочу создать поле базы данных в Marklogic Server для patent-assignor и patent-assignee, чтобы я мог использовать cts:field-word-query. Но я хочу найти имя патентообладателя и патентообладателя (оба содержат один и тот же элемент «name»). Может ли кто-нибудь сказать мне, как я могу сопоставить поле для патентообладателя с именем патентообладателя и патентообладателем с именем патентообладателя, чтобы я мог использовать cts:field-word-query в именах патентообладателя и патентообладателя. Я хочу точного совпадения.


person Puneet Pant    schedule 07.05.2012    source источник


Ответы (2)


На самом деле это не похоже на вариант использования индекса поля. Просто поместите индекс на элемент 'name', и оба случая будут проиндексированы в одном и том же индексе. Чтобы сделать различие, оберните word-query или value-query element-query для соответствующего родительского элемента.

person grtjn    schedule 07.05.2012
comment
Я не говорю об индексах здесь. Я хочу создать поле, а не индекс! - person Puneet Pant; 07.05.2012
comment
@puneet-pant Возможно, вас заинтересует следующий раздел Руководства администратора MarkLogic, в котором объясняется, как работают поля и какие у вас есть параметры: http://docs.marklogic.com/5.0doc/docapp.xqy#display.xqy?fname=http://pubs/5.0doc/xml/admin/fields.xml&query=Fields - person grtjn; 07.05.2012
comment
Я уже прошел по этой ссылке, но не мог понять, как сопоставить правообладателя патента с именем правопреемника патента и правопреемником патента с именем правопреемника патента. Не могли бы вы объяснить мне, пожалуйста, как это сделать? - person Puneet Pant; 07.05.2012
comment
Похоже, ваш вопрос подразумевает, что вы не знаете, что такое «поле» в MarkLogic. Будьте точны в отношении поиска, который вы хотите запустить, и результатов, которые вы ожидаете, и, возможно, кто-то сможет помочь вам больше. - person Eric Bloch; 07.05.2012

Я думаю, что комментарии выше о том, как убедиться, что вы понимаете доступные варианты, важны для рассмотрения. Если я правильно понял ваш вопрос, MarkLogic, вероятно, сможет ответить на ваш поиск, используя только «универсальный индекс».

Поскольку и правопреемник, и правопреемник используют элемент с именем «name», запросить точное совпадение у обоих на самом деле довольно просто (точное совпадение обычно подразумевает value-query, а не word-query).

cts:element-value-query(xs:QName("name"), "VOLPENHEIN, ROBERT A.")

Однако, если в ваших данных есть больше элементов «name», кроме цедента и правопреемника, и вам нужно сузить количество попаданий, чтобы они поступали только из этих, а не из других полей «name», вы можете использовать element-queries для ограничения поиска (чтобы получить это к хорошо масштабируйтесь, пожалуйста, убедитесь, что для параметров element-word-positions и element-value-positions в вашей базе данных установлено значение true)

cts:or-query((

    cts:element-query( xs:QName("patent-assignor"), 
                       cts:element-value-query(
                           xs:QName("name"), 
                           "VOLPENHEIN, ROBERT A.")),

    cts:element-query( xs:QName("patent-assignee"), 
                       cts:element-value-query(
                           xs:QName("name"), 
                           "VOLPENHEIN, ROBERT A."))
))

Поля могут быть очень эффективными в отношении изоляции определенных элементов, особенно когда необходимо следовать сложной логике «включает» и «исключает». Я думаю, что, скорее всего, вы сможете сделать вещи более гибкими, просто используя «универсальный индекс» для фильтрации во время запроса.

person derickson    schedule 07.05.2012
comment
Приведенный выше запрос можно было бы сократить, если бы вы передали несколько QName в один элемент-запрос. Функция принимает последовательность в качестве первого аргумента. Может быть очень полезно время от времени .. - person grtjn; 07.05.2012
comment
@derickson Спасибо за подробное объяснение. У меня есть еще один вопрос, если я хочу сравнить имена патентоуступателя и патентообладателя и хочу вернуть только те результаты, в которых имена патентоуступателя и патентообладателя не совпадают. Тогда как мне написать запрос? - person Puneet Pant; 08.05.2012
comment
вы можете использовать cts:not-query для сравнения ваших значений. Так что вы получите результат, где имена не совпадают - person Sofia; 28.06.2016