Hi all,
I need to have advanced queries within a field. For example for field
"DOC" and query text "foo AND bar" the query text is expected to be
parsed into the following query:
<cts:and-query>
<cts:field-word-query>
<cts:field>DOC</cts:field>
<cts:text>foo</cts:text>
</cts:field-word-query>
<cts:field-word-query>
<cts:field>DOC</cts:field>
<cts:text>foo</cts:text>
</cts:field-word-query>
</cts:and-query>
I very much prefer to use search:parse to achieve this because the
parser should handle complex queries that may include phrase,
grouping, and etc and search:parse does this quite well.
However search:parse seems unable to parse the field queries the same
way that it does text queries (see below for a demo). Is there any way
to do this with search:parse or should I write my own parser?
Here is a simple script to demonstrate this.
xquery version "1.0-ml";
import module namespace search =
"http://marklogic.com/appservices/search" at
"/MarkLogic/appservices/search/search.xqy";
let $options :=<options xmlns="http://marklogic.com/appservices/search">
<constraint name="DOC">
<word><field name="doc-field"/></word>
</constraint>
</options>
for $query in ('foo AND bar', 'DOC:foo AND bar', 'DOC:"foo AND bar"',
'DOC:(foo AND bar)')
return fn:concat($query,' => ',xdmp:quote(search:parse($query, $options)))
results in:
foo AND bar => <cts:and-query qtextjoin="AND" strength="20"
xmlns:cts="http://marklogic.com/cts">
<cts:word-query qtextref="cts:text">
<cts:text>foo</cts:text>
</cts:word-query>
<cts:word-query qtextref="cts:text">
<cts:text>bar</cts:text>
</cts:word-query>
</cts:and-query>
DOC:foo AND bar => <cts:and-query qtextjoin="AND" strength="20"
xmlns:cts="http://marklogic.com/cts">
<cts:field-word-query qtextpre="DOC:" qtextref="cts:annotation">
<cts:annotation qtextref="following-sibling::cts:text"/>
<cts:field>doc-field</cts:field>
<cts:text>foo</cts:text>
</cts:field-word-query>
<cts:word-query qtextref="cts:text">
<cts:text>bar</cts:text>
</cts:word-query>
</cts:and-query>
DOC:"foo AND bar" => <cts:field-word-query qtextpre="DOC:"
qtextref="cts:annotation" xmlns:cts="http://marklogic.com/cts">
<cts:annotation qtextpre="""
qtextref="following-sibling::cts:text" qtextpost="""/>
<cts:field>doc-field</cts:field>
<cts:text>foo AND bar</cts:text>
</cts:field-word-query>
DOC:(foo AND bar) => <cts:field-word-query qtextpre="DOC:"
qtextref="cts:annotation" xmlns:cts="http://marklogic.com/cts">
<cts:annotation qtextref="following-sibling::cts:text"/>
<cts:field>doc-field</cts:field>
<cts:text>foo bar</cts:text>
</cts:field-word-query>
Best regards,
Majid Valipour
Scholars Portal
_______________________________________________
General mailing list
[email protected]
http://developer.marklogic.com/mailman/listinfo/general