The searchable expression we are using is //div and the documents are similar to xhtml.
It would appear the problem comes because <div> elements can have multiple child <div> elements so the sort expression of //div/@order can have multiple values... which is also the reason $result/@order solves the problem. Is there a way to specify sorting on a result attribute? On Fri, Mar 15, 2013 at 12:14 PM, Danny Sokolsky < [email protected]> wrote: > Hi Keith,**** > > ** ** > > What do your documents look like, and do you have a searchable > expression? And what version of MarkLogic are you running? If you do have > a fragment root, you should ideally search at the fragment root, not above > it. It seems to do the right thing for me when I use a searchable > expression. **** > > ** ** > > Here is an example that I think gives the answer you are looking for. For > this example, I have div as a fragment root, a codepoint range index on > div/@order, and a searchable expression of /foo/div. I am using 6.0-2.2. > **** > > ** ** > > Here is what I did:**** > > ** ** > > xquery version "1.0-ml";**** > > xdmp:document-insert("/keith1.xml",**** > > <foo>**** > > <div order="3">hello</div>**** > > <div order="1">hello</div>**** > > </foo>),**** > > xdmp:document-insert("/keith2.xml",**** > > <foo>**** > > <div order="2">hello</div>**** > > <div order="4">hello</div>**** > > </foo>);**** > > ** ** > > import module namespace search = "http://marklogic.com/appservices/search" > **** > > at "/MarkLogic/appservices/search/search.xqy";**** > > ** ** > > let $options := **** > > <options xmlns="http://marklogic.com/appservices/search">**** > > <searchable-expression>/foo/div</searchable-expression>**** > > <sort-order type="xs:string" direction="ascending" **** > > collation="http://marklogic.com/collation/codepoint">**** > > <element ns="" name="div"/>**** > > <attribute ns="" name="order"/>**** > > </sort-order>**** > > <debug>true</debug>**** > > </options>**** > > return**** > > search:search("hello", $options), **** > > ** ** > > xdmp:version()**** > > ** ** > > **ð ** And here are the results, which seem to be ordered correctly:**** > > ** ** > > <search:response snippet-format="snippet" total="4" start="1" > page-length="10" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="" > xmlns:search="http://marklogic.com/appservices/search">**** > > <search:result index="1" uri="/keith1.xml" > path="fn:doc("/keith1.xml")/foo/div[2]" score="14336" > confidence="0.370487" fitness="0.718278">**** > > <search:snippet>**** > > <search:match > path="fn:doc("/keith1.xml")/foo/div[2]"><search:highlight>hello</search:highlight></search:match> > **** > > </search:snippet>**** > > </search:result>**** > > <search:result index="2" uri="/keith2.xml" > path="fn:doc("/keith2.xml")/foo/div[1]" score="14336" > confidence="0.370487" fitness="0.718278">**** > > <search:snippet>**** > > <search:match > path="fn:doc("/keith2.xml")/foo/div[1]"><search:highlight>hello</search:highlight></search:match> > **** > > </search:snippet>**** > > </search:result>**** > > <search:result index="3" uri="/keith1.xml" > path="fn:doc("/keith1.xml")/foo/div[1]" score="14336" > confidence="0.370487" fitness="0.718278">**** > > <search:snippet>**** > > <search:match > path="fn:doc("/keith1.xml")/foo/div[1]"><search:highlight>hello</search:highlight></search:match> > **** > > </search:snippet>**** > > </search:result>**** > > <search:result index="4" uri="/keith2.xml" > path="fn:doc("/keith2.xml")/foo/div[2]" score="14336" > confidence="0.370487" fitness="0.718278">**** > > <search:snippet>**** > > <search:match > path="fn:doc("/keith2.xml")/foo/div[2]"><search:highlight>hello</search:highlight></search:match> > **** > > </search:snippet>**** > > </search:result>**** > > <search:qtext>hello</search:qtext>**** > > <search:report id="SEARCH-FLWOR">(for $result in cts:search(/foo/div, > cts:word-query("hello", ("lang=en"), 1), ("score-logtfidf"), 1) order by > xs:string(($result//div/@order)[1]) ascending collation " > http://marklogic.com/collation/codepoint" return $result)[1 to > 10]</search:report>**** > > <search:metrics>**** > > <search:query-resolution-time>PT0.073S</search:query-resolution-time>* > *** > > <search:facet-resolution-time>PT0S</search:facet-resolution-time>**** > > > <search:snippet-resolution-time>PT0.007S</search:snippet-resolution-time>* > *** > > <search:total-time>PT0.081S</search:total-time>**** > > </search:metrics>**** > > </search:response>**** > > 6.0-2.2**** > > ** ** > > -Danny**** > > ** ** > > *From:* [email protected] [mailto: > [email protected]] *On Behalf Of *Keith Breinholt > *Sent:* Thursday, March 14, 2013 2:56 PM > *To:* General MarkLogic Developer Discussion > *Subject:* [MarkLogic Dev General] How do I sort by result attribute in > search:search()?**** > > ** ** > > We have a search:search() query that searches for <div> elements in a > database fragmented on <div> tags. > > We want to sort the <div> tags based on an @order attribute so we passing > the sort-order option: > > <sort-order type="xs:string" direction="ascending"> > <element ns="" name="div"/> > <attribute ns="" name="order"/> > </sort-order> > > But the results returned are not sorted on the order attribute. > > When we turn on debugging with the <debug>true</debug> option I see in the > SEARCH-FLWOR the order by phrase: > > order by xs:string(($result//div/@order)[1]) ascending > > What we actually want is: > > order by xs:string($result/@order) ascending > > If I run the cts:query from the SEARCH-FLWOR with that modified order by > phrase it returns results sorted exactly as wanted. > > Is there a way to coax search:search() to sort specifically on an > attribute of the result? > > -- > Keith > "Do what you can, with what you have, where you are." - Theodore Roosevelt > **** > > _______________________________________________ > General mailing list > [email protected] > http://developer.marklogic.com/mailman/listinfo/general > > -- Keith "Do what you can, with what you have, where you are." - Theodore Roosevelt
_______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general
