Like Damon, I suspect that the /item... bit is the expensive part, probably 
because of the database lookup inside the predicate.

But why use search:search() at all? It seems to me that you aren't really using 
any of the search:search features, and would be better off using cts:query 
directly.

for $n in cts:search(
  doc(),
  cts:and-query(
    (cts:element-attribute-range-query(
       xs:QName("journal_cite"),
       xs:QName("datetimeRecevied"), ">", $dateTime),
     cts:collection-query('/citation/type/journal_cite'))))[1 to 100]
let $doi := $n/citation/target_doi/data(.)
return element result {
  $n,
  /item[@doi = $doi] }

If you only wanted the URIs you could also use cts:uris() - but since you are 
fetching the documents anyway, cts:search is probably a little more efficient.

-- Mike

On 21 Mar 2012, at 06:02 , Damon Feldman wrote:

> Dean,
>  
>  
> Try removing sub-expressions until you have a minimal expression that shows 
> the problem. E.g. does just the search:search() call work, without any other 
> code?
>  
> I suspect your XPath: /item[@doi= <expr>] may be the problem. If the <expr> 
> is not properly formed (e.g. missing a namespace, misspelled element) you 
> could get many items retrieved rather than just one, and that would be 
> executed for every result.
>  
> Retrieving all results is not possible with search:search() to avoid huge 
> queries, which would time out. If your DB only has, say, 10,000 items and you 
> think they can come back in a single call, set the page size to 10,000. If 
> you think you can get 20MM in one shot, use that limit, etc. The idea is to 
> force the developer to think hard about how big that result set can be and 
> explicitly set the limits.
>  
> Yours,
> Damon
>  
> From: [email protected] 
> [mailto:[email protected]] On Behalf Of Dean Pullen
> Sent: Wednesday, March 21, 2012 7:37 AM
> To: [email protected]
> Subject: [MarkLogic Dev General] Query times out, and page-limit constraints
>  
> Hi all,
> 
> I'm relatively new to Marklogic and have an example query to debug (at end of 
> email).
> 
> I've got two questions - 
> 1) Why does this time out? We have a lot of data, but it's constrained by a 
> page-limit of 100 and by the given $dateTimeStr variable. Should I be 
> searching using some other method, like a constraint or what? You'll notice 
> the search:search first parm is '' i.e. blank.
> 
> 2) How can I (once question 1 is 'fixed') retrieve ALL results and not just 
> the number of pages specified by the page-limit.
> 
> 
> Many thanks,
> 
> Dean.
> 
> 
> QUERY:
> 
> 
> xquery version "1.0-ml";
> 
> import module namespace search = "http://marklogic.com/appservices/search";
> at "/MarkLogic/appservices/search/search.xqy";
> 
> declare variable $dateTimeStr as xs:string := '2012-02-01T18:43:30.728';
> 
> 
> Ddeclare function local:retrieveiteminfo($result as element(citation)) as 
> element(search:result) {
> 
>     <search:result>
>         {/item[@doi = $result/target_doi]}
>     </search:result>
> };
> 
> let $dateTime := xs:dateTime($dateTimeStr)
> 
> let $top-citation-results:= search:search('',
>     <options xmlns="http://marklogic.com/appservices/search";>
>         <additional-query>{
>             cts:and-query((
>             cts:element-attribute-range-query(xs:QName("journal_cite"),
>             xs:QName("datetimeRecevied"), ">", $dateTime),
>             cts:collection-query('/citation/type/journal_cite')
>             ))
>     
>             }
>         </additional-query>
>     </options>,
>             1,
>             100
>             )
> 
> 
>         for $uri in $top-citation-results/search:result/@uri
>         return
> <search:result>{fn:doc($uri)}{/item[@doi = 
> fn:doc($uri)/citation/target_doi]}</search:result>
> 
> 
> 
> _______________________________________________
> General mailing list
> [email protected]
> http://developer.marklogic.com/mailman/listinfo/general

_______________________________________________
General mailing list
[email protected]
http://developer.marklogic.com/mailman/listinfo/general

Reply via email to