Преобразование запросов XQuery в CTS - PullRequest
0 голосов
/ 24 мая 2018

Привет, я новичок в MarkLogic и, читая документацию по ML, обнаружил, что производительность выполнения запроса CTS лучше, чем выполнение простого XQuery.

Требование: Мне нужно преобразовать ниже XQuery вЗапрос CTS для выполнения поиска для XPath и его значений, а также я не хочу создавать индекс диапазона пути для XPath, потому что я получаю Xpath динамически.

for $document in collection()[/tXML/Message/TEST/TEST1/TESTID="10"]
return
    (
        if(fn:not(fn:empty($document/tXML/Message/TEST/TESTID))) then $document/tXML/Message/TEST/TESTID else "NULL",
        if(fn:not(fn:empty($document/tXML/Message/TEST/TESTType))) then $document/tXML/Message/TEST/TESTType else "NULL",
        if(fn:not(fn:empty($document/tXML/Message/TEST/TESTStatus))) then $document/tXML/Message/TEST/TESTStatus else "NULL"
    )

Так что, пожалуйста, помогите мне узнать, является ли онможно сформировать CTS Query для Above XQuery.

1 Ответ

0 голосов
/ 26 мая 2018

Если вы не можете добавить индексы пути, но важен весь путь (поэтому вы не можете просто использовать просто a cts:element-value-query(xs:QName('TESTID'), "10")), тогда вы можете использовать стек запросов элементов, подобный этому

let $query := 
    cts:element-query(xs:QName('tXML'),
        cts:element-query(xs:QName('Message'),
            cts:element-query(xs:QName('TEST'),
                cts:element-query(xs:QName('TEST1'),
                    cts:element-value-query(xs:QName('TESTID'), "10")))))

В соответствии с документами об элементах , вы захотите включить индексы "позиция слова" и "позиция слова элемента".

Обработка результатов поиска ничем не отличается.

 for $document in cts:search(collection(), $query)
 return (
    if(fn:not(fn:empty($document/tXML/Message/TEST/TESTID))) then $document/tXML/Message/TEST/TESTID else "NULL",
    if(fn:not(fn:empty($document/tXML/Message/TEST/TESTType))) then $document/tXML/Message/TEST/TESTType else "NULL",
    if(fn:not(fn:empty($document/tXML/Message/TEST/TESTStatus))) then $document/tXML/Message/TEST/TESTStatus else "NULL"
)
...