I forgot to say the version, I'm using 5.0-5 Sorry for the confusion, from the initial $query:
let $query := <cts:and-query xmlns:cts="http://marklogic.com/cts"> { dls:documents-query() } <cts:not-query> <cts:collection-query> <cts:uri>error</cts:uri> <cts:uri>collection-A</cts:uri> <cts:uri>collection-B</cts:uri> </cts:collection-query> </cts:not-query> <cts:collection-query> <cts:uri>collection-C</cts:uri> <cts:uri>collection-D</cts:uri> </cts:collection-query> <cts:properties-query> <cts:element-query> <cts:element xmlns:ft="http://thecompany/facet">ft:author</cts:element> *<cts:word-query qtextref="cts:text" xmlns:xs=" http://www.w3.org/2001/XMLSchema">* * <cts:text>fiber</cts:text>* * <cts:option>case-insensitive</cts:option>* * <cts:option>diacritic-insensitive</cts:option>* * <cts:option>punctuation-insensitive</cts:option>* * <cts:option>whitespace-insensitive</cts:option>* * <cts:option>stemmed</cts:option>* * <cts:option>wildcarded</cts:option>* * </cts:word-query>* </cts:element-query> </cts:properties-query> </cts:and-query> The bolded part (the word-query) is the result of a search:parse, like this: let $options := <options xmlns="http://marklogic.com/appservices/search"> <term> <term-option>case-insensitive</term-option> <term-option>diacritic-insensitive</term-option> <term-option>punctuation-insensitive</term-option> <term-option>whitespace-insensitive</term-option> <term-option>stemmed</term-option> <term-option>wildcarded</term-option> </term> </options> return search:parse("fiber", $options) the query text could be more complex, like this: "fiber OR silicon", and then it won't be a word-query and that's why I can't use the element-word-query you suggested me. The user inputs a text to find, he can use the default grammar (AND, OR, parentisis, double quotes), and can limit the elements to search (one or more than one), then dynamically the element-queries are created and each one will use the parsed query text. On Thu, May 16, 2013 at 4:03 PM, Michael Blakeley <[email protected]> wrote: > I don't see it, unless maybe it's a release-specific bug. With 6.0-3: > > import module namespace search = "http://marklogic.com/appservices/search" > at "/MarkLogic/appservices/search/search.xqy"; > > search:parse( > 'author:foo', > <options xmlns="http://marklogic.com/appservices/search"> > <return-results>true</return-results> > <constraint name="author"> > <range type="xs:string"> > <element ns="http://thecompany/facet" name="author"/> > <fragment-scope>properties</fragment-scope> > <facet-option>concurrent</facet-option> > <facet-option>item-order</facet-option> > <facet-option>ascending</facet-option> > <facet-option>limit=6</facet-option> > </range> > </constraint> > <term> > <term-option>case-insensitive</term-option> > <term-option>diacritic-insensitive</term-option> > <term-option>punctuation-insensitive</term-option> > <term-option>whitespace-insensitive</term-option> > <term-option>stemmed</term-option> > <term-option>wildcarded</term-option> > </term> > </options>) > => > <cts:properties-query qtextref="schema-element(cts:query)" xmlns:cts=" > http://marklogic.com/cts" xmlns:xs="http://www.w3.org/2001/XMLSchema"> > <cts:element-range-query qtextpre="author:" qtextref="cts:annotation" > operator="="> > <cts:element xmlns:_1="http://thecompany/facet > ">_1:author</cts:element> > <cts:annotation qtextref="following-sibling::cts:value"/> > <cts:value xsi:type="xs:string" xmlns:xsi=" > http://www.w3.org/2001/XMLSchema-instance">foo</cts:value> > </cts:element-range-query> > </cts:properties-query> > > I copied those options verbatim from your email. But the query output is > different. I see an element-range query, not an element-query. > > Are you sure those options match up with your test case? > > -- Mike > > On 16 May 2013, at 11:57 , Mauricio Valderrama Fonseca <[email protected]> > wrote: > > > Hi Michael, > > > > The <cts:word-query..> in the script is the result of a search:parse > execution, then I cannot use the element-word-query. I need to get the > matches limiting the search to a specific element (in the document or in > the properties), and using the element-query retrieves the right results. I > tried using a constraint and it worked fine when the element was in the > document, but when the element is in the properties I could not make it > worked. Is there any other way to make it accurate instead of using the > "element word positions" index? > > > > Thanks > > > > > > On Thu, May 16, 2013 at 12:14 PM, Michael Blakeley <[email protected]> > wrote: > > It looks to me like you could use an element-word-query instead of a > nested element-query/word-query combination. That will be more efficient. > > > > http://docs.marklogic.com/cts:element-word-query > > > > Accurate results with element-query alone will often require element > positions, for example the "element word positions" index. However > positions require extra disk space and CPU time, so unless they are > necessary I prefer to avoid them. > > > > http://docs.marklogic.com/guide/admin/text_index > > > > -- Mike > > > > On 16 May 2013, at 07:50 , Mauricio Valderrama Fonseca < > [email protected]> wrote: > > > > > Hi All, > > > > > > I'm facing a problem using the search:resolve function, this is the > xquery: > > > > > > xquery version "1.0-ml"; > > > import module namespace dls = "http://marklogic.com/xdmp/dls" at > "/MarkLogic/dls.xqy"; > > > import module namespace search=" > http://marklogic.com/appservices/search" at > "/MarkLogic/appservices/search/search.xqy"; > > > > > > let $query := <cts:and-query xmlns:cts="http://marklogic.com/cts"> > > > { dls:documents-query() } > > > <cts:not-query> > > > <cts:collection-query> > > > <cts:uri>error</cts:uri> > > > <cts:uri>collection-A</cts:uri> > > > <cts:uri>collection-B</cts:uri> > > > </cts:collection-query> > > > </cts:not-query> > > > <cts:collection-query> > > > <cts:uri>collection-C</cts:uri> > > > <cts:uri>collection-D</cts:uri> > > > </cts:collection-query> > > > <cts:properties-query> > > > <cts:element-query> > > > <cts:element xmlns:ft="http://thecompany/facet > ">ft:author</cts:element> > > > <cts:word-query qtextref="cts:text" xmlns:xs=" > http://www.w3.org/2001/XMLSchema"> > > > <cts:text>fiber</cts:text> > > > <cts:option>case-insensitive</cts:option> > > > <cts:option>diacritic-insensitive</cts:option> > > > <cts:option>punctuation-insensitive</cts:option> > > > <cts:option>whitespace-insensitive</cts:option> > > > <cts:option>stemmed</cts:option> > > > <cts:option>wildcarded</cts:option> > > > </cts:word-query> > > > </cts:element-query> > > > </cts:properties-query> > > > </cts:and-query> > > > > > > let $options := <options xmlns=" > http://marklogic.com/appservices/search"> > > > <return-results>true</return-results> > > > <constraint name="author"> > > > <range type="xs:string"> > > > <element ns="http://thecompany/facet" name="author"/> > > > <fragment-scope>properties</fragment-scope> > > > <facet-option>concurrent</facet-option> > > > <facet-option>item-order</facet-option> > > > <facet-option>ascending</facet-option> > > > <facet-option>limit=6</facet-option> > > > </range> > > > </constraint> > > > <term> > > > <term-option>case-insensitive</term-option> > > > <term-option>diacritic-insensitive</term-option> > > > <term-option>punctuation-insensitive</term-option> > > > <term-option>whitespace-insensitive</term-option> > > > <term-option>stemmed</term-option> > > > <term-option>wildcarded</term-option> > > > </term> > > > </options> > > > > > > return search:resolve($query, $options) > > > > > > > > > The result is this one: > > > > > > <search:response total="32" start="1" page-length="10" xmlns="" > xmlns:search="http://marklogic.com/appservices/search"> > > > <search:facet name="author"> > > > <search:facet-value name="author 1" count="1">author > 1</search:facet-value> > > > <search:facet-value name="author 2" count="1">author > 2</search:facet-value> > > > <search:facet-value name="author 3" count="1">author > 3</search:facet-value> > > > <search:facet-value name="author 4" count="1">author > 4</search:facet-value> > > > <search:facet-value name="author 5" count="1">author > 5</search:facet-value> > > > <search:facet-value name="author 6" count="1">author > 6</search:facet-value> > > > </search:facet> > > > <search:metrics> > > > > <search:query-resolution-time>PT0.007S</search:query-resolution-time> > > > > <search:facet-resolution-time>PT0.002S</search:facet-resolution-time> > > > > <search:snippet-resolution-time>PT0S</search:snippet-resolution-time> > > > <search:total-time>PT0.01S</search:total-time> > > > </search:metrics> > > > </search:response> > > > > > > > > > > > > In that case the facet is done using a element-range-index: <element > ns="http://thecompany/facet" name="author"/> this element is in the > properties, but the result is inconsistent too if we use an element in the > document. It is important to make notice that the facet and the results are > CONSISTENT until we include a <cts:element-query> in the query. > > > > > > Watching the source, I noticed the functions: cts:element-values and > cts:frequency are used to create the search:facet element. Then, I tried > them directly and had the same result: > > > > > > > > > xquery version "1.0-ml"; > > > import module namespace dls = "http://marklogic.com/xdmp/dls" at > "/MarkLogic/dls.xqy"; > > > > > > let $facet-options := ("type=string", "properties", "descending", > "frequency-order", "limit=6") > > > let $query := cts:document-fragment-query( > > > cts:and-query(( > > > dls:documents-query(), > > > cts:not-query(cts:collection-query(("error", "collection-A", > "collection-B")), 1), > > > cts:collection-query(("collection-C", "collection-D")), > > > cts:properties-query( > > > cts:element-query( > > > fn:QName("http://thecompany/facet", "author"), > > > cts:word-query( > > > "fiber", > > > > ("case-insensitive","diacritic-insensitive","punctuation-insensitive","whitespace-insensitive","stemmed","wildcarded","lang=en"), > > > 1 > > > ), > > > () > > > ) > > > ) > > > ), ()) > > > ) > > > return > > > cts:element-values(fn:QName("http://thecompany/facet","author"),(),($facet-options,"concurrent"),$query,1, > ()) > > > > > > > > > The response was: > > > > > > author 1 > > > author 2 > > > author 3 > > > author 4 > > > author 5 > > > author 6 > > > > > > Now, executing a cts:search with the same $query value: > > > > > > xquery version "1.0-ml"; > > > import module namespace dls = "http://marklogic.com/xdmp/dls" at > "/MarkLogic/dls.xqy"; > > > > > > let $query := cts:document-fragment-query( > > > cts:and-query(( > > > dls:documents-query(), > > > cts:not-query(cts:collection-query(("error", "collection-A", > "collection-B")), 1), > > > cts:collection-query(("collection-C", "collection-D")), > > > cts:properties-query( > > > cts:element-query( > > > fn:QName("http://thecompany/facet", "author"), > > > cts:word-query( > > > "fiber", > > > > ("case-insensitive","diacritic-insensitive","punctuation-insensitive","whitespace-insensitive","stemmed","wildcarded","lang=en"), > > > 1 > > > ), > > > () > > > ) > > > ) > > > ), ()) > > > ) > > > return cts:search(fn:collection(),$query) > > > > > > > > > I got an empty sequence. Then the questions are: Why am I getting this > inconsistencies when there is an element-query in the search? how can I > avoid it? > > > > > > Thanks! > > > > > > _______________________________________________ > > > General mailing list > > > [email protected] > > > http://developer.marklogic.com/mailman/listinfo/general > > > > _______________________________________________ > > General mailing list > > [email protected] > > http://developer.marklogic.com/mailman/listinfo/general > > > > > > > > -- > > Atentamente > > Mauricio Valderrama Fonseca > > _______________________________________________ > > General mailing list > > [email protected] > > http://developer.marklogic.com/mailman/listinfo/general > > _______________________________________________ > General mailing list > [email protected] > http://developer.marklogic.com/mailman/listinfo/general > -- Atentamente Mauricio Valderrama Fonseca
_______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general
