Hi,
I tried adding the unwildcarded option but it is still not working. I am
attaching my query and the sample data on which I am running my query. Please
let me know if anything can be done to bring up results containing "?" in them.
Thanks
Yashmeet
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Michael Blakeley
Sent: Tuesday, June 19, 2012 8:59 PM
To: MarkLogic Developer Discussion
Subject: Re: [MarkLogic Dev General] cts:search and xdmp:save()
Understandable, I think. The sample code is hard to read, and won't parse or
run in its current form. But Mary has powerful ESP.
Here's a test case that shows what I think Mary has in mind. Punctuation in the
query text could be punctuation or could be a wildcard. Since the term is
punctuation-insensitive, it is treated as a wildcard. The wildcard will be
looking for a word character, not a punctuation character, the term fails to
match anything. The second two forms show possible fixes: be explicit about no
wildcards, or be punctuation-sensitive.
(: punctuation-insensitive, implicit wildcard :) cts:contains(
element test { "EPL and Fixtures: Are the fixtures out?" },
cts:element-value-query(
xs:QName('test'),
"EPL and Fixtures: Are the fixtures out?",
("case-insensitive",
"diacritic-sensitive",
"punctuation-insensitive",
"unstemmed",
"lang=en"))),
(: explicitly not a wildcard :)
cts:contains(
element test { "EPL and Fixtures: Are the fixtures out?" },
cts:element-value-query(
xs:QName('test'),
"EPL and Fixtures: Are the fixtures out?",
('unwildcarded',
"case-insensitive",
"diacritic-sensitive",
"punctuation-insensitive",
"unstemmed",
"lang=en"))),
(: default wildcard, punctuation-sensitive :) cts:contains(
element test { "EPL and Fixtures: Are the fixtures out?" },
cts:element-value-query(
xs:QName('test'),
"EPL and Fixtures: Are the fixtures out?",
("case-insensitive",
"diacritic-sensitive",
"punctuation-sensitive",
"unstemmed",
"lang=en")))
=>
false
true
true
-- Mike
On 19 Jun 2012, at 07:20 , David Lee wrote:
> This is confusing to me.
> From my read of this, the "?" is in the data not the query ... so how is
> wildcarded or not affect this ?
>
> ----------------------------------------------------------------------
> -------
> David Lee
> Lead Engineer
> MarkLogic Corporation
> [email protected]
> Phone: +1 650-287-2531
> Cell: +1 812-630-7622
> www.marklogic.com
>
> This e-mail and any accompanying attachments are confidential. The
> information is intended solely for the use of the individual to whom it is
> addressed. Any review, disclosure, copying, distribution, or use of this
> e-mail communication by others is strictly prohibited. If you are not the
> intended recipient, please notify us immediately by returning this message to
> the sender and delete all copies. Thank you for your cooperation.
>
> From: [email protected]
> [mailto:[email protected]] On Behalf Of Mary
> Holstege
> Sent: Tuesday, June 19, 2012 10:13 AM
> To: MarkLogic Developer Discussion
> Subject: Re: [MarkLogic Dev General] cts:search and xdmp:save()
>
> Try adding an explicit unwilcarded option. Question mark is a wildcard
> character, so you are looking for something that matches that word with one
> more character at the end.
>
> Sent from my Samsung Epic(tm) 4G
>
>
> Yeshmeet Singh <[email protected]> wrote:
>
>
> Hi,
>
> I am having some trouble with the cts:search. I have an application in
> which when a user enters a search term I take that term and search it
> through the marklogic collections and return the result. Now what
> problem I am facing is that in the database in my xml file I have a
> tag called <head>, now if in this head if I have any statement that
> has a "?" in it it is not being returned by the cts:search. For
> example if I search for a term say "EPL and Fixtures" what I do first
> is create a cts:element-value-match query to search the database first
> and store that query in a variable which gives me the following
> output-
>
> Let $t := <v:results v:warning="non-element item"><cts:and-query>
> <cts:or-query><cts:element-value-query>
> <cts:element>_1:head</cts:element>
> <cts:text xml:lang="en">EPL and Fixtures: Are the fixtures
> out?</cts:text> <cts:option>case-insensitive</cts:option>
> <cts:option>diacritic-sensitive</cts:option>
> <cts:option>punctuation-insensitive</cts:option>
> <cts:option>unstemmed</cts:option>
> </cts:element-value-query>
> <cts:element-value-query>
> <cts:element>_1:head</cts:element>
> <cts:text xml:lang="en">Fixtures and the EPL 2009:
> Champion?</cts:text> <cts:option>case-insensitive</cts:option>
> <cts:option>diacritic-sensitive</cts:option>
> <cts:option>punctuation-insensitive</cts:option>
> <cts:option>unstemmed</cts:option>
> </cts:element-value-query>
> </cts:or-query>
> <cts:element-word-query>
> <cts:element>_1:head</cts:element>
> <cts:textxml:lang="en">EPL</cts:text>
> <cts:option>case-insensitive</cts:option>
> <cts:option>diacritic-sensitive</cts:option>
> <cts:option>punctuation-insensitive</cts:option>
> <cts:option>unstemmed</cts:option>
> </cts:element-word-query>
> <cts:or-query>
> <cts:element-word-query>
> <cts:element>_1:head</cts:element>
> <cts:textxml:lang="en">Fixtures</cts:text>
> <cts:option>case-insensitive</cts:option>
> <cts:option>diacritic-sensitive</cts:option>
> <cts:option>punctuation-insensitive</cts:option>
> <cts:option>unstemmed</cts:option>
> </cts:element-word-query>
> <cts:element-word-query>
> <cts:element>_1:head</cts:element>
> <cts:textxml:lang="en">Fixtures*</cts:text>
> <cts:option>case-insensitive</cts:option>
> <cts:option>diacritic-sensitive</cts:option>
> <cts:option>punctuation-insensitive</cts:option>
> <cts:option>unstemmed</cts:option>
> </cts:element-word-query>
> </cts:or-query>
> <cts:collection-query>
> <cts:uri>dictionaryid </cts:uri>
> </cts:collection-query>
> <cts:collection-query><cts:uri>dictionarystatus</cts:uri>
> </cts:collection-query>
> </cts:and-query>
> </v:results>
>
> Now I make a call to my cts search-
> Let result := cts:search(/wl:start, $t)
>
> The above does not return any result. And this is happening only for those
> terms in my <head> tag that have "?".
>
> Also I wanted to write the output of my xqy file into an xml file. Using
> xdmp:save() we can create a text file. Is there any way to create an xml file?
>
> Thanks
> Yashmeet Singh
>
> **************** CAUTION - Disclaimer ***************** This e-mail
> contains PRIVILEGED AND CONFIDENTIAL INFORMATION intended solely for
> the use of the addressee(s). If you are not the intended recipient,
> please notify the sender by e-mail and delete the original message.
> Further, you are not to copy, disclose, or distribute this e-mail or
> its contents to any other person and any such actions are unlawful.
> This e-mail may contain viruses. Infosys has taken every reasonable
> precaution to minimize this risk, but is not liable for any damage you
> may sustain as a result of any virus in this e-mail. You should carry
> out your own virus checks before opening the e-mail or attachment.
> Infosys reserves the right to monitor and review the content of all
> messages sent to or from this e-mail address. Messages sent to or from this
> e-mail address may be stored on the Infosys e-mail system.
> ***INFOSYS******** End of Disclaimer ********INFOSYS***
>
> _______________________________________________
> General mailing list
> [email protected]
> http://community.marklogic.com/mailman/listinfo/general
_______________________________________________
General mailing list
[email protected]
http://community.marklogic.com/mailman/listinfo/general
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<wl:body>
<wl:entries>
<wl:data id="1" priority="1">
<wl:head>keep playing</wl:head>
</wl:data>
<wl:data id="2" priority="1">
<wl:head>Can you please clear the table?</wl:head>
</wl:data>
<wl:data id="3" priority="1">
<wl:head>Dormer</wl:head>
</wl:data>
<wl:data id="4" priority="1">
<wl:head>can i have a word with u?</wl:head>
</wl:data>
<wl:data id="5" priority="1">
<wl:head>you can go to play</wl:head>
</wl:data>
<wl:data id="6" priority="1">
<wl:head>where i every one?</wl:head>
</wl:data>
<wl:data id="7" priority="1">
<wl:head>Shutt</wl:head>
</wl:data>
</wl:entries>
</wl:body>Following is the piece of code i am trying to run:
let $search := 'can i have a word with you?'
let $suggestLimit := 10
let $otions :=(
<cts:option
xmlns:cts="http://marklogic.com/cts">punctuation-insensitive</cts:option>
<cts:option
xmlns:cts="http://marklogic.com/cts">case-insensitive</cts:option>
<cts:option
xmlns:cts="http://marklogic.com/cts">diacritic-sensitive</cts:option>
<cts:option xmlns:cts="http://marklogic.com/cts">unstemmed</cts:option>
)
let $stripped :=xdmp:apply(xdmp:function(xs:QName(function path)(used to remove
some noise words)
(:this return us-$stripped :='can i have word with you?':)
let $elem := fn:QName('namespace', 'head')
let $title-query :=
cts:query(lex:build-lexicon-based-query($search, $stripped, $elem,
$dictionaryId, $suggestLimit))
(:this is my build-lexicon-based-query function:)
declare function lex:build-lexicon-based-query(
$original as xs:string,
$stripped as xs:string+,
$elem as xs:QName,
$dictionaries as xs:string+,
$limit as xs:integer,
{
let $matches := lex:get-strings($original, $stripped, $elem, $restriction,
$limit, $profile)
return
element cts:and-query {
element cts:or-query {
for $title in $matches
return
element cts:element-value-query {
element cts:element { $elem },
element cts:text { $title },
$options)
}
},
()
}
};
(:following is my lex:get-string function:)
declare function lex:get-strings(
$original as xs:string,
$stripped as xs:string,
$elem as xs:QName,
$limit as xs:integer,
{
let $qtokens := fn:tokenize($stripped, ' ')
let $options := if(functx:get-matches($qtokens[fn:last()], '\d+$')) then
($options,"collation=http://marklogic.com/collation/en/S1/AS/T0020")
else $options
return
if(fn:count($qtokens) = 1)
then
let $count := 0
let $first-pass :=
if ($original ne $stripped) then
(cts:element-value-match($elem, $original, $options),
cts:element-value-match($elem, $stripped, $options))
else
cts:element-value-match($elem, $original, $options)
let $first-pass := ($first-pass,cts:element-value-match($elem,
fn:concat($qtokens, '*'), $options))
let $count := fn:count($first-pass)
let $second-pass :=
if($count lt $limit) then
fn:distinct-values(($first-pass,
cts:element-value-match($elem, fn:concat($qtokens, "* *"),
$options)))
else ()
let $count := fn:count($second-pass)
let $third-pass :=
if($count lt $limit) then
fn:distinct-values(($first-pass,$second-pass,
cts:element-value-match($elem, fn:concat("*",$stripped,"*"),
$options)))
else ()
let $count := fn:count($third-pass)
let $fourth-pass :=
if($count lt $limit) then
fn:distinct-values(($first-pass,$second-pass,$third-pass,
cts:element-value-match($elem, fn:concat("*",$original,"* *"),
$options)))
else ()
return
fn:distinct-values(($first-pass,$second-pass,$third-pass,$fourth-pass))
else
let $count := 0
let $first-pass := (cts:element-value-match($elem, $original, $options),
cts:element-value-match($elem, fn:concat($original,
'*'), $options),
cts:element-value-match($elem, fn:concat($stripped,
'*'), $options))
let $count := fn:count($first-pass)
let $second-pass :=
if($count lt $limit) then
fn:distinct-values(($first-pass,
(if($original ne $stripped) then
(cts:element-value-match($elem, fn:concat('* ',$original,
' *'), $options),
cts:element-value-match($elem, fn:concat('* ',$stripped, '
*'), $options))
else
cts:element-value-match($elem, fn:concat('* ',$original, ' *'),
$options))))
else ()
let $count := fn:count($second-pass)
let $third-pass :=
if($count lt $limit) then
let $third := fn:string-join(
for $term in $qtokens[1 to fn:last()-1]
return
fn:concat('* ', $term, '*'), ' '
)
let $third := fn:concat($third,' ',(fn:concat('*
',$qtokens[fn:last()], '* *')))
return
fn:distinct-values(($first-pass,$second-pass,
cts:element-value-match($elem,$third,
$options)))
else ()
let $count := fn:count($third-pass)
let $fourth-pass :=
if($count lt $limit) then
fn:distinct-values(($first-pass,$second-pass,$third-pass,
for $term in $qtokens
return (
cts:element-value-match($elem, fn:concat('* ', $term, '
*'), $options))
))
else ()
let $count := fn:count($fourth-pass)
let $fifth-pass :=
if($count lt $limit) then
fn:distinct-values(($first-pass,$second-pass,$third-pass,$fourth-pass,
for $term in $qtokens
return (
cts:element-value-match($elem, fn:concat('* ',
$term, '* *'), $options)
)
))
else ()
return
fn:distinct-values(($first-pass,$second-pass,$third-pass,$fourth-pass,$fifth-pass))
};
(:Now once i get my results in $title-query i pass that through cts:search)
let $results :=
rslt:build-results(
(cts:search(/wl:data, $title-query)[1 to $constant:FILTERLIMIT])
As i wrote i my mail i am getting results in $title-query but when i pass it
through cts:search no results come up._______________________________________________
General mailing list
[email protected]
http://community.marklogic.com/mailman/listinfo/general