Как выполнить XQuery ниже, используя cts:element-values

У меня ниже запрос, который использует cts:search который занимает много времени при запуске в производстве

xquery version "1.0-ml";
(: let $limit := ()  use this instead to display all values :)
for $uri in cts:uri-match("/tag-cloud/*")
let $values :=""
let $region := fn:substring-before(fn:substring-after($uri, "/tag-cloud/"), ".xml")
let $doc := concat("/tag-cloud/",$region,".xml")
let $distinct-search-text := cts:search(doc($doc)/All-searchtext/searchtext,
               cts:element-attribute-range-query(xs:QName("searchtext"), xs:QName("date"),
               ">=",
              (fn:current-date() - xs:dayTimeDuration("P2D"))
              )


             )

let $result-xml :=  for $each-search-text in fn:distinct-values($distinct-search-text/text())
                let $count := count($distinct-search-text[text() eq $each-search-text]) 
                order by $count descending
                return 
                fn:concat($region,"	", $each-search-text, "	",$count) 


return 
for $eachtag in (($result-xml)[1 to 15])
  return ($eachtag)

Может ли кто-нибудь, пожалуйста, помогите мне переписать вышеуказанный запрос, используя cts:element-values функция, потому что мне просто нужны значения с частотой.

Я попытался запрос ниже, но фильтрация не работает должным образом. Любая помощь очень ценится

xquery version "1.0-ml";
let $limit := 15
(: let $limit := ()  use this instead to display all values :)
for $uri in cts:uri-match("/tag-cloud/*")
let $region := fn:substring-before(fn:substring-after($uri, "/tag-cloud/"), ".xml")
let $values :=
cts:element-values(
  xs:QName("searchtext"),
  "",
  (
    "collation=http://marklogic.com/collation/codepoint",
    "item-frequency",
    "frequency-order",
    "descending",
    if (fn:exists($limit)) then fn:concat("limit=", $limit) else ()
  ),
 cts:and-query((
   cts:element-attribute-range-query(xs:QName("searchtext"), xs:QName("date"),
               ">=",
              (fn:current-date() - xs:dayTimeDuration("P2D"))
              ),
 cts:document-query($uri)))
 )
 for $value in $values
 return
   fn:concat($region, "	", $value, "	", cts:frequency($value))

Спасибо

1 ответ

Если вы получите документ с doc()Нет причин искать. У вас уже есть документ.

Еще один общий момент: вы должны попытаться создать один поисковый запрос, который делает то, что вы хотите, вместо того, чтобы повторять и выполнять несколько поисковых запросов. Например, вместо перебора cts:uri-match()подумайте, сможете ли вы исполнить cts:search() с cts:directory-query() пункт.

Для конкретной проблемы, я не уверен, что понимаю цель. Если вы создаете индекс диапазона в тексте поиска, вы можете рассчитать частоты, как описано в:

http://docs.marklogic.com/cts:frequency

Если вам нужны эти частоты для отражения региона, один из подходов состоит в том, чтобы встроить регион в значения текста поиска.

Но, может быть, я неправильно понимаю цель.

Надеюсь, что это поможет,

Эрик Хеннум

Другие вопросы по тегам