Right, I am not saying there is a difference, just that this form, in my testing, performs better than Geert's suggestion...perhaps you could verify this against your data as well, if you have the time. That's all. Thanks.
From: [email protected] [mailto:[email protected]] On Behalf Of Stephane Toussaint Sent: Wednesday, May 25, 2011 11:19 AM To: General MarkLogic Developer Discussion Subject: Re: [MarkLogic Dev General] How to specified a result root node ? Hum, I not sure to see a real difference with what I wrote : let $gq := cts:element-value-query(xs:QName("title"), "foobar") let $fq := cts:element-value-query(xs:QName("lastname"), "toussaint") let $jq := cts:and-query(($gq, $fq)) return cts:search( xdmp:directory("/test/"), $jq )//*:author[cts:contains(. , $fq)] Stephane Le 25 mai 2011 à 16:42, Fernandes, Nivaldo a écrit : Hi Stephanie, I still found this to perform better than Geert's suggestion for comparison, although I am using testing data that is different from yours, and that could play a role. So, I am interested in the results of your comparisons, if you undertake them. let $query := cts:and-query(( cts:element-value-query(xs:QName("title"),"foobar"), cts:element-value-query(xs:QName("lastname"),"touissant") )) return cts:search( xdmp:directory("/test/"), $query ) //*:author[cts:contains(. , "touissant")], xdmp:query-meters() From: [email protected] [mailto:[email protected]] On Behalf Of Fernandes, Nivaldo Sent: Wednesday, May 25, 2011 9:50 AM To: General MarkLogic Developer Discussion Subject: Re: [MarkLogic Dev General] How to specified a result root node ? Yes, that is true...it will also return all the other authors in the same fragment as touissant... From: [email protected] [mailto:[email protected]] On Behalf Of Stephane Toussaint Sent: Wednesday, May 25, 2011 9:46 AM To: General MarkLogic Developer Discussion Subject: Re: [MarkLogic Dev General] How to specified a result root node ? This query return to much nodes. See the sample, the author "my self" should not be returned. Thanks Steph Le 25 mai 2011 à 15:31, Fernandes, Nivaldo a écrit : Or this one: let $query := cts:and-query(( cts:element-value-query(xs:QName("title"),"foobar"), cts:element-value-query(xs:QName("lastname"),"touissant") )) return cts:search( xdmp:directory("/test/"), $query ) //*:author From: [email protected] [mailto:[email protected]] On Behalf Of Geert Josten Sent: Wednesday, May 25, 2011 9:00 AM To: General MarkLogic Developer Discussion Subject: Re: [MarkLogic Dev General] How to specified a result root node ? Hi Stephane, Might be worth to compare the performance of your search with this one (which should produce the same results as far as I can see): let $gq := cts:element-value-query(xs:QName("title"), "foobar") let $fq := cts:element-value-query(xs:QName("lastname"), "toussaint") return cts:search( xdmp:directory("/test/"), $gq )//*:author[cts:contains(. , $fq)] Kind regards, Geert Van: [email protected] [mailto:[email protected]] Namens Stephane Toussaint Verzonden: woensdag 25 mei 2011 14:35 Aan: General MarkLogic Developer Discussion Onderwerp: Re: [MarkLogic Dev General] How to specified a result root node ? Damon, Thank you for your answer. The use of cts:contains is a nice way of doing filter operation. Thank you for that. To answer my last use case, I need to separate query in 2 parts. A global and a filtering one. Both are combined to produce the search query, and finally the last one is use alone for filtering let $gq := cts:element-value-query(xs:QName("title"), "foobar") let $fq := cts:element-value-query(xs:QName("lastname"), "toussaint") let $jq := cts:and-query(($gq, $fq)) return cts:search( xdmp:directory("/test/"), $jq )//*:author[cts:contains(. , $fq)] It is the only way I found to retrieve only the author node that match both the title and the lastname author. This may seem weird here because I only propose one doc in sample, but say I need to filter on the title too. I would like to not need to know which part of the query is effective for filtering and which not, but I think that in my case I can handle it (this Xquery is build from the value set by a user in a form way). Anyway thank you for the hint. Thanks Stephane Le 24 mai 2011 à 18:30, Damon Feldman a écrit : Stephane, You are on the right track. To search the entire document, use the xdmp:directory() expression as the "searchable expression" but you will get entire documents back from that search. To find the author you want you may use cts:contains(). This is the function that performs the "filtering" check referenced in our documentation, where it checks an in-memory XML structure to see if a query condition holds rather than checking the DB indexes for the query condition. This example (namespace removed for convenience) should help: xquery version "1.0-ml"; let $d := <doc docId="1"> <title>foobar</title> <authors> <author> <firstname>stephane</firstname> <lastname>toussaint</lastname> </author> <author> <firstname>my</firstname> <lastname>self</lastname> </author> </authors> </doc> return xdmp:document-insert("/test/text.xml", $d) ; let $q := cts:word-query("stephane") (: "stephane" is a shorthand for this word query :) return cts:search(/doc, $q)//author[cts:contains(., $q)] For more precision, you may also use cts:element-query(xs:QName("author"), cts:word-query("stephane")). Yours, Damon From: [email protected] [mailto:[email protected]] On Behalf Of Stephane Toussaint Sent: Tuesday, May 24, 2011 8:28 AM To: General MarkLogic Developer Discussion Subject: [MarkLogic Dev General] How to specified a result root node ? Hi, I'm trying to specified a result root node for my query in a customizable context. Take this documents for instance ("/test/doc1.xml") : <?xml version="1.0" encoding="UTF-8"?> <doc docId="1" xmlns="sto:test"> <title>foobar</title> <authors> <author> <firstname>stephane</firstname> <lastname>toussaint</lastname> </author> <author> <firstname>my</firstname> <lastname>self</lastname> </author> </authors> </doc> I'd like to retrieve for instance doc which contains title "foobar". Easy enough the query will be : cts:search( xdmp:directory("/test/"), cts:element-value-query(fn:QName("sto:test", "title"), "foobar") ) Now if I want to retrieve docs written by toussaint. cts:search( xdmp:directory("/test/"), cts:element-value-query(fn:QName("sto:test", "lastname"), "toussaint") ) Ok, so far so good. Now I want to change the root of the element to return. I'd like to return authors instead of the doc directly. Retrieving the authors of a particular doc is easy : cts:search( xdmp:directory("/test/"), cts:element-value-query(fn:QName("sto:test", "title"), "foobar") )//*:author But now if I want only authors with 'toussaint' has lastname cts:search( xdmp:directory("/test/"), cts:element-value-query(fn:QName("sto:test", " lastname "), "toussaint") )//*:author This query doesn't work because it return every authors for the document with an author named toussaint (return 2 results instead of one). The thing is to change the root node of the search query : cts:search( xdmp:directory("/test/")//*:author, cts:element-value-query(fn:QName("sto:test", "lastname"), "toussaint") ) But how could I combined for instance title with lastname and return only the author ? cts:search( xdmp:directory("/test/")//*:author, cts:and-query(( cts:element-value-query(fn:QName("sto:test", "title"), "foobar"), cts:element-value-query(fn:QName("sto:test", "lastname"), "toussaint") )) ) This return nothing because there is no 'title' element under 'author' cts:search( xdmp:directory("/test/"), cts:and-query(( cts:element-value-query(fn:QName("sto:test", "title"), "foobar"), cts:element-value-query(fn:QName("sto:test", "lastname"), "toussaint") )) )//*:author This returns 2 authors instead of only the matching one. So briefly the question is, whatever the constraint part of my query I want to be able to retrieve the closet element of the root element I choose to return (I hope I'm clear enough). Is there something that can be done with the cts api ? Thanks, Stéphane _______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general _______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general <image001.jpg> Stéphane TOUSSAINT XMS Technical Product Leader Tel : 01.61.08.50.30 Std : 01.61.08.50.20 Fax : 01.61.38.24.41 _______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general
_______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general
