This is the query that I had tried and results with debug = true. import module namespace mlsearch="http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy"; declare namespace ml="http://services.mycompany.com/shared/xmlschema/activityitem_marklogic/2"; declare namespace sc="http://services.mycompany.com/shared/xmlschema/servicescommon/2"; declare namespace cdi="http://services.mycompany.com/shared/xmlschema/coredataitem/2";
let $options2 := <options xmlns="http://marklogic.com/appservices/search"> <additional-query>{cts:and-query(cts:element-query(xs:QName("sc:filter"),cts:element-value-query(xs:QName("sc:filtertype"),"source")))}</additional-query> <constraint name="source"> <range type="xs:string" facet="true" collation="http://marklogic.com/collation/"> <element ns="http://services.mycompany.com/shared/xmlschema/servicescommon/2" name="filtervalue" /> <attribute name="name" /> <facet-option>frequency-order</facet-option> <facet-option>ascending</facet-option> </range> </constraint> <searchable-expression xmlns:sc="http://services.mycompany.com/shared/xmlschema/servicescommon/2">//sc:filter</searchable-expression> <debug>true</debug> </options> let $result2 := mlsearch:search(" " ,$options2) return $result2 <search:response total="1" start="1" page-length="10" xmlns="" xmlns:search="http://marklogic.com/appservices/search"> <search:result index="1" uri="/abc.xml" path="fn:doc("/abc.xml")/*:activityitem_marklogic/*:filterlist[2]/*:filterlist/*:filter" score="18432" confidence="0.674626" fitness="0.674626"> <search:snippet> <search:match path="fn:doc("/abc.xml")/*:activityitem_marklogic/*:filterlist[2]/*:filterlist/*:filter">source NjQxOQ</search:match> </search:snippet> </search:result> <search:facet name="source"> <search:facet-value name="SOURCE" count="1">SOURCE</search:facet-value> <search:facet-value name="DOMAIN" count="1">DOMAIN</search:facet-value> </search:facet> <search:qtext> </search:qtext> <search:report id="SEARCH-SCHEMAINVALID"><error:format-string xmlns:error="http://marklogic.com/xdmp/error">XDMP-VALIDATEMISSINGATTR: (err:XQDY0027) validate strict { $opt } -- Missing required attribute: Found (@name) but required (@ns & @name) at /search:options/search:constraint/search:range/search:attribute using schema "search.xsd"</error:format-string><error:data xmlns:error="http://marklogic.com/xdmp/error"> <error:datum>(@name)</error:datum> <error:datum>(@ns & @name)</error:datum> <error:datum>/search:options/search:constraint/search:range/search:attribute</error:datum> <error:datum>"search.xsd"</error:datum> </error:data></search:report> <search:report id="SEARCH-FLWOR">(cts:search(//sc:filter, cts:and-query(cts:element-query(fn:QName("http://services.mycompany.com/shared/xmlschema/servicescommon/2", "filter"), cts:element-value-query(fn:QName("http://services.mycompany.com/shared/xmlschema/servicescommon/2", "filtertype"), "source", ("lang=en"), 1), ()), ()), ("score-logtfidf"), 1))[1 to 10]</search:report> <search:metrics> <search:query-resolution-time>PT0.172S</search:query-resolution-time> <search:facet-resolution-time>PT0S</search:facet-resolution-time> <search:snippet-resolution-time>PT0.016S</search:snippet-resolution-time> <search:total-time>PT0.188S</search:total-time> </search:metrics> </search:response> And there is only one document in the database - /abc.xml <ns8:activityitem_marklogic xml:lang="en" xmlns:ns2="http://services.mycompany.com/shared/xmlschema/servicescommon/2" xmlns:ns5="http://services.mycompany.com/shared/xmlschema/coredataitem/2" xmlns:ns8="http://services.mycompany.com/shared/xmlschema/activityitem_marklogic/2"> <ns5:filterlist connector="and"> <ns2:filterlist connector="or"> <ns2:filter> <ns2:filtertype name="Source">domain</ns2:filtertype> <ns2:filtervalue name="DOMAIN">NjQxOQ</ns2:filtervalue> </ns2:filter> </ns2:filterlist> </ns5:filterlist> <ns5:filterlist connector="and"> <ns2:filterlist connector="or"> <ns2:filter> <ns2:filtertype name="Source">source</ns2:filtertype> <ns2:filtervalue name="SOURCE">NjQxOQ</ns2:filtervalue> </ns2:filter> </ns2:filterlist> </ns5:filterlist> </ns8:activityitem_marklogic> > Date: Wed, 14 Mar 2012 16:53:52 +0000 > From: Will Thompson <[email protected]> > Subject: Re: [MarkLogic Dev General] Search - Additional Query > To: MarkLogic Developer Discussion <[email protected]>, > "[email protected]" <[email protected]> > Message-ID: > <[email protected]> > Content-Type: text/plain; charset="us-ascii" > > It may just be a typo, but this options node is missing some closing tags. > Try search:check-options($OPTIONS) before executing your search:search call. > > -Will > > -----Original Message----- > From: [email protected] > [mailto:[email protected]] On Behalf Of Vedavalli > Radhika > Sent: Wednesday, March 14, 2012 4:38 AM > To: [email protected]; [email protected] > Subject: Re: [MarkLogic Dev General] Search - Additional Query > > I even tried to remove the filtertype constraint and searchable > expressions and use element query in additional query as mentioned in > the post - "Using additional-query with cts:search" by Geert Josten. > This too did not help. No results or facets are returned if I use the > below additional query. > > <additional-query>{cts:element-query(xs:QName("sc:filter"),cts:element-value-query(xs:QName("sc:filtertype"),"source"))}</additional-query> > > Previous query: > let $options := > <options xmlns="http://marklogic.com/appservices/search"> > <additional-query>{cts:directory-query("/my-directory/", > "infinity")}</additional-query> > <constraint name="filtertype"> > <value type="xs:string" facet="false" > collation="http://marklogic.com/collation/"> > <element ns="my-namespace" name="filtertype" /> > <constraint name="source"> > <range type="xs:string" facet="true" > collation="http://marklogic.com/collation/"> > <element ns=" my-namespace " name="filtervalue" /> > <attribute name="name"/> > <facet-option>frequency-order</facet-option> > <facet-option>descending</facet-option> > </range> > </constraint> > </options> > > let $result := search:search("searchable:filter filtertype:source" > ,$options) > return $result > > > On 3/14/12, Vedavalli Radhika <[email protected]> wrote: >> I have fixed the options node as suggested. But my problem is still >> not resolved. >> >> I made one more level of progress. But still not able to fetch the >> expected results. >> With the below cts:search, I am able to retrieve the expected nodes. >> for $x in cts:search(//sc:filter,cts:and-query >> ((cts:element-value-query(xs:QName("sc:filtertype"),"source"), >> cts:directory-query("/my-directory/","infinity")))) >> return $x >> >> <v:results> >> <ns2:filter> >> <ns2:filtertype name="Source">source</ns2:filtertype> >> <ns2:filtervalue name="ABCD">ABCDE</ns2:filtervalue> >> <ns2:filtervalue name="1234"> 12345</ns2:filtervalue> >> </ns2:filter> >> </v:results> >> >> So, I tried to convert this cts:search into search:search. Made use of >> the element value range constraint for filtertype, additional query >> for the directory and searchable expression to request the specific >> "filter" tag alone. But no facets are getting generated with the >> searchable expression in place. >> This issue is becoming a critical one to solve. Can someone help me in >> attacking the problem. >> >> let $options := >> <options xmlns="http://marklogic.com/appservices/search"> >> <additional-query>{cts:directory-query("/my-directory/", >> "infinity")}</additional-query> >> <constraint name="source"> >> <range type="xs:string" facet="true" >> collation="http://marklogic.com/collation/"> >> <element ns=" my-namespace " name="filtervalue" >> /> >> <attribute name="name"/> >> <facet-option>frequency-order</facet-option> >> <facet-option>descending</facet-option> >> </range> >> </constraint> >> <mlsearch:operator name='searchable'> >> <mlsearch:state name='filter'> >> <searchable-expression >> xmlns:sc="my-namespace">//sc:filter</searchable-expression> >> </mlsearch:state> >> </mlsearch:operator> >> </options> >> >> let $result := search:search("searchable:filter filtertype:source" >> ,$options) >> return $result >> >> >>> Date: Tue, 13 Mar 2012 14:41:52 -0700 >>> From: Danny Sokolsky <[email protected]> >>> Subject: Re: [MarkLogic Dev General] Search - Additional Query >>> To: MarkLogic Developer Discussion <[email protected]> >>> Message-ID: >>> <c9924d15b04672479b089f7d55ffc1322262136...@exchg-be.marklogic.com> >>> Content-Type: text/plain; charset="us-ascii" >>> >>> That is not a valid options node you have. I see several problems with >>> it: >>> >>> 1) it is not in the http://marklogic.com/appservices/search namespace >>> 2) there are 2 additional-query elements. If you want to combine them, >>> make >>> an and-query of the 2 additional-query elements. >>> 3) the second additional-query is not a query, it is a search. >>> >>> I recommend using search:check-options on your options node to make sure >>> it >>> is valid (or adding the <debug>true</debug> option to your options node. >>> >>> So maybe try fixing the options node and see if that gets you any >>> farther. >>> >>> -Danny >>> >>> >>> -----Original Message----- >>> From: [email protected] >>> [mailto:[email protected]] On Behalf Of Vedavalli >>> Radhika >>> Sent: Tuesday, March 13, 2012 6:15 AM >>> To: General Mark Logic Developer Discussion >>> Subject: Re: [MarkLogic Dev General] Search - Additional Query >>> >>> I wrongly typed the current query that I am using, >>> It is the below: >>> "let $options := >>> <options> >>> >>> <additional-query>{cts:directory-query("/my-directory/", >>> "infinity")}</additional-query> >>> >>> <additional-query>{cts:and-query(cts:element-value-query(xs:QName("sc:filtertype"),"source"))}</additional-query> >>> >>> <constraint name="source"> >>> <range type="xs:string" facet="true" >>> collation="http://marklogic.com/collation/"> >>> <element ns="my-namespace" name="filtervalue" >>> /> >>> <attribute name="name" /> >>> <facet-option>frequency-order</facet-option> >>> </range> >>> </constraint> >>> </options> >>> >>> let $result := mlsearch:search($queryString ,$options) >>> >>> return $result" >>> >>> >>> On 3/13/12, Vedavalli Radhika <[email protected]> wrote: >>>> For the given format of xmls, I have to form facets of filtertype >>>> elements which has filtertype value as "source" alone. >>>> >>>> <ns8:activityitem> >>>> <ns5:filterlist> >>>> <ns2:filterlist><ns2:filter> >>>> <ns2:filtertype name="Source">source</ns2:filtertype> >>>> <ns2:filtervalue name="ABCD">ABCDE</ns2:filtervalue> >>>> <ns2:filtervalue name="1234">12345</ns2:filtervalue> >>>> </ns2:filter> >>>> </ns2:filterlist> >>>> <ns2:filterlist> >>>> <ns2:filter> >>>> <ns2:filtertype name="Source">domain</ns2:filtertype> >>>> <ns2:filtervalue name="FIVE">FIVES</ns2:filtervalue> >>>> </ns2:filter> >>>> </ns2:filterlist> >>>> </ns5:filterlist> >>>> </ns8:activityitem_marklogic> >>>> >>>> For the following code, >>>> >>>> let $options := >>>> <options> >>>> >>>> <additional-query>{cts:directory-query("/my-directory/", >>>> "infinity")}</additional-query> >>>> <additional-query>{for $x in cts:search(//cdi:filterlist, >>>> cts:directory-query("/my-directory/","infinity")) >>>> return $x/sc:filterlist/sc:filter[sc:filtertype eq >>>> "source"]/sc:filtervalue}</additional-query> >>>> >>>> <constraint name="source"> >>>> <range type="xs:string" facet="true" >>>> collation="http://marklogic.com/collation/"> >>>> <element ns="my-namespace" name="filtervalue" >>>> /> >>>> <attribute name="name" /> >>>> <facet-option>frequency-order</facet-option> >>>> </range> >>>> </constraint> >>>> </options> >>>> >>>> let $result := mlsearch:search($queryString ,$options) >>>> >>>> return $result >>>> >>>> The facet results are as follows: >>>> <search:facet name="source"> >>>> <search:facet-value name="ABCD" count="1">ABCD</search:facet-value> >>>> <search:facet-value name="1234" count="1">1234</search:facet-value> >>>> <search:facet-value name="FIVE" count="1">FIVE</search:facet-value> >>>> </search:facet> >>>> >>>> But whereas I expect only the first two entries. >>>> The query is returning all filtervalues in the given xml whenever it >>>> finds a filtertype element in it's xml with value as "source". >>>> But I am expecting only the filtervalues for which the sibling node >>>> filtertype has value as source. >>>> >>>> I tried to build a xquery using xpath. This is giving me expected >>>> results. But I am unable to fit this in the additional-query. >>>> >>>> for $x in cts:search(//ns5:filterlist, >>>> cts:directory-query("/my-directory/","infinity")) >>>> return $x/sc:filterlist/sc:filter[sc:filtertype eq >>>> "source"]/sc:filtervalue >>>> >>>> When I include the above inside additional-query, I am getting the >>>> following exception. >>>> "XDMP-QUERYELEM: cts:query(<cts:and-query >>>> xmlns:cts="http://marklogic.com/cts"><cts:and-query strength="20" >>>> qtextjoin=""><cts:and-query qtextco...</cts:and-query>) -- Query >>>> element contains unknown child: /cts:and-query" >>>> >>>> 1. Please help me resolve the issue. >>>> 2. I am also not sure if the above way is the best way to solve the >>>> problem. Give me your suggestions on how can I best(in terms of >>>> performance) solve the issue at hand. >>>> >>>> Thanks, >>>> Radhika. >>>> >>> _______________________________________________ >>> General mailing list >>> [email protected] >>> http://developer.marklogic.com/mailman/listinfo/general >> > _______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general
