ОБНОВЛЕНО: см. Конец - пример, показывающий, что 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) вопросы, приведенные ниже:
- Для кого-то, что понимает внутренности MarkLogic, вы бы рассмотреть каратов-поисково-> цикл -> SDMO: узел-URI(), чтобы быть (другими словами, могу ли я активировать это без расширения документа в расширенный кеш дерева?)
- Если нет, можете ли вы подумать о более эффективном способе имитировать 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 просто дал мне целую коллекцию, когда он не должен был дать мне ничего и КТС: поиск дал правильный ответ.
ОК. Благодарю. Должно быть, я схожу с ума. Мне нужно посмотреть на полный образец клиента (с более сложным обратным запросом). Тем не менее, это работает, как вы описали - и в моей локальной выборке из нескольких сотен тысяч обратных запросов работает отлично! Приветствия. –
Я просто расширил свой ответ, а также опубликовал комментарий. Я получаю ситуации, когда я получаю ложные срабатывания с помощью cts: uris. Но я отслеживаю это до, возможно, проблемы с обратными индексами до слияния.? Как только я отслеживаю это и получаю ответ, возможно, cts: uris велика. Спасибо –