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
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
<<image001.jpg>>
_______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general
