2016-06-06 2 views
2

ОБНОВЛЕНО: см. Конец - пример, показывающий, что cts: uris не является допустимым подходом, так как он не возвращает правильные результаты во всех случаях.Возврат только URI от cts: обратный запрос

У меня есть прецедент, где в MarkLogic у меня будет иногда сотни тысяч совпадений в результатах поиска, содержащих запрос cts: reverse-query. При этом все, что я хочу вернуть, это URI документов, соответствующих результатам, чтобы я мог их кэшировать и обрабатывать их через Corb2 позже.

Пример кода:

xquery version "1.0-ml"; 


let $_ := xdmp:invoke-function(function(){ 
    for $val in ("foo", "bar", "baz") 
    let $query := <query>{cts:element-word-query(xs:QName("what"), ($val))}</query> 
    return (
       xdmp:document-insert("/test/reverse-" || $val ||".xml", $query,(), ("test-reverse")), 
       xdmp:commit() 
      ) 

},<options xmlns="xdmp:eval"> 
     <transaction-mode>update</transaction-mode> 
     </options> 
) 


return for $result in cts:search(collection("test-reverse"), cts:reverse-query(<what>baz</what>)) 
    return xdmp:node-uri($result) 

И это возвращает:

/test/reverse-baz.xml 

который, как ожидается.

Тем не менее, я чувствую себя, так как я делаю слишком много обработки здесь, так как у меня уже есть документ из cts: search(). Но опять же, поскольку ML является Lazy, может быть, даже сейчас, у меня действительно есть только ссылка, поскольку я не получил доступ к чему-либо в документе.?

Я хотел бы использовать cts: uris(), чтобы получить тот же результат, что и выше. Тем не менее, вы не можете использовать cts: обратный запрос с cts: uris()

Да, я понимаю, что обратный запрос никогда не обязательно должен быть в базе данных в качестве документа для его использования (cts: содержит пример) поэтому в некоторых случаях использования URI не существуют. Но для меня это так.

Кроме того, я уверен, что я могу использовать xdmp: план() для создания запроса, необходимый для карат: Юрис() вынув окончательного плана и переписывание пространства имен cts, но я не уверен, что это еще быстрее.

С учетом указанных выше, (2) вопросы, приведенные ниже:

  1. Для кого-то, что понимает внутренности MarkLogic, вы бы рассмотреть каратов-поисково-> цикл -> SDMO: узел-URI(), чтобы быть (другими словами, могу ли я активировать это без расширения документа в расширенный кеш дерева?)
  2. Если нет, можете ли вы подумать о более эффективном способе имитировать cts: uris быстрее, чем я выше?

Почему не каратов: Юрис() - потому что я не нахожу спички, я вернусь все:

xquery version "1.0-ml"; 


let $_ := xdmp:invoke-function(function(){ 
    for $val in ("foo", "bar", "baz") 
    let $query := <query>{cts:element-word-query(xs:QName("what"), ($val))}</query> 
    return (
       xdmp:document-insert("/test/reverse-" || $val ||".xml", $query,(), ("test-reverse")), 
       xdmp:commit() 
      ) 

},<options xmlns="xdmp:eval"> 
     <transaction-mode>update</transaction-mode> 
     </options> 
) 


return cts:uris((),(), 
    cts:and-query((
    cts:collection-query("test-reverse"), 
    cts:reverse-query((<foo/>)) 
))) 

Возвращает:
/test/reverse-bar.xml
/test/reverse-baz.xml
/test/reverse-foo.xml

И окончательный образец, показывающий разницу в результатах (проверка что CTS: URIs не работает):

xquery version "1.0-ml"; 


let $_ := xdmp:invoke-function(function(){ 
    for $val in ("foo", "bar", "baz") 
    let $query := <query>{cts:element-word-query(xs:QName("what"), ($val))}</query> 
    return (
       xdmp:document-insert("/test/reverse-" || $val ||".xml", $query,(), ("test-reverse")), 
       xdmp:commit() 
      ) 

},<options xmlns="xdmp:eval"> 
     <transaction-mode>update</transaction-mode> 
     </options> 
) 

let $uris-from-cts-uris := cts:uris((),(), 
    cts:and-query((
    cts:collection-query("test-reverse"), 
    cts:reverse-query(<foo/>) 
))) 

let $uris-from-search := for $result in cts:search(collection("test-reverse"), cts:reverse-query(<foo/>)) 
    return xdmp:node-uri($result) 

return 
(
    $uris-from-cts-uris, 
    "xxxxxxxxxxxxxxxxx", 
    $uris-from-search 

) 

Какие результаты в этом:

/тест/реверс-бар.XML
/test/reverse-baz.xml
/test/reverse-foo.xml
xxxxxxxxxxxxxxxxx

Это гласит: каратов: URIs просто дал мне целую коллекцию, когда он не должен был дать мне ничего и КТС: поиск дал правильный ответ.

ответ

3

Почему вы не можете использовать cts: reverse-query() с cts: uris()?

Попробуйте это:

cts:uris((),(), 
    cts:and-query((
    cts:collection-query("test-reverse"), 
    cts:reverse-query(<what>baz</what>) 
))) 
+0

ОК. Благодарю. Должно быть, я схожу с ума. Мне нужно посмотреть на полный образец клиента (с более сложным обратным запросом). Тем не менее, это работает, как вы описали - и в моей локальной выборке из нескольких сотен тысяч обратных запросов работает отлично! Приветствия. –

+0

Я просто расширил свой ответ, а также опубликовал комментарий. Я получаю ситуации, когда я получаю ложные срабатывания с помощью cts: uris. Но я отслеживаю это до, возможно, проблемы с обратными индексами до слияния.? Как только я отслеживаю это и получаю ответ, возможно, cts: uris велика. Спасибо –

0

Ahh - и теперь мы к чему-то. Я получил ложные совпадения, как описано. НО, после того, как я вручную слился, я получил правильные ответы. Итак, копайте с результатами предварительного слияния и после слияния, чтобы узнать, могу ли я раскрыть причину ...

Итак, cts: uris действителен, но не всегда и, по-видимому, связан с слиянием ..?

+0

Я бы не ожидал, что это будет связано с деятельностью слияния. Следует иметь в виду, что cts: uris() нефильтруется, поэтому вам нужно иметь достаточную информацию индекса, чтобы дать точные результаты для ваших запросов. –

+0

спасибо. Я посмотрю глубже, чтобы понять, почему иногда я получаю разные результаты. но даже тогда, когда cts: uris не работает, он фактически возвращает все .. не ничего .. наверняка не то, что я ожидал бы или хотел бы. –

Смежные вопросы