[MarkLogic Dev General] Help with xQuery Syntax
Colleen Whitney
Colleen.Whitney at marklogic.com
Thu Mar 4 08:01:16 PST 2010
Chris,
Depending on the type of query you want to perform on those structures, it sounds more like a <word>, <value> or <range> constraint. One tutorial you might want to look at, in addition to those Mike lists below, is:
http://developer.marklogic.com/howto/tutorials/2009-07-search-api-walkthrough.xqy
That has some information on the different constraint types and how they relate to the searches you want to perform.
--Colleen
________________________________________
From: general-bounces at developer.marklogic.com [general-bounces at developer.marklogic.com] On Behalf Of Chris Morgan [cmorgan at globalcloud.net]
Sent: Thursday, March 04, 2010 5:14 AM
To: Michael Blakeley
Cc: General Mark Logic Developer Discussion
Subject: Re: [MarkLogic Dev General] Help with xQuery Syntax
Thanks, Michael. After reading about the search API, it does seem like a simpler approach. So in order to perform a google-like search within any Sect1 or Sect2 in the structure below, I would use a collection constraint -- correct?
Thanks again for your help.
Chris
On Wed, Mar 3, 2010 at 11:42 AM, Michael Blakeley <michael.blakeley at marklogic.com<mailto:michael.blakeley at marklogic.com>> wrote:
Chris,
Why not use the higher-level search:search() API? The function reference page is http://developer.marklogic.com/pubs/4.1/apidocs/SearchAPI.html#search:search
The Search Developer's Guide (http://developer.marklogic.com/pubs/4.1/books/search-dev-guide.pdf) has more about the high-level search API.
If you need to use the lower-level cts:search() API for some reason, start with http://developer.marklogic.com/howto/tutorials/ and the "Paginated Search for Web Applications" tutorial.
-- Mike
On 2010-03-03 03:38, Chris Morgan wrote:
Hello,
I'm new to MarkLogic and am having trouble getting a search query to work properly. Specifically, I'm attempting to build a simple query of a DocBook style document. The structure of the document is as follows:
<article>
<sect1>
<title>The first title</sect1>
<para>a paragraph of text</para>
<sect2>
<title>The first title</sect1>
<para>a paragraph of text</para>
</sect2>
</sect1>
</article>
My goal is to build a simple search tool that will search through all<sect1> and<sect2> elements and find any paragraph containing the search term. I'd like to return:
<a href="somelink.xqy">Section Title</a>
<p>Paragraph text with<span class="highlight">highlighted search term</span> in it.</p>
The problem is that when I loop through the paragraphs containing the search term, I return every sect1 or sect2 title, regardless of whether that title contains para elements with the search term.
Here's what I have so far:
=======================================
xquery version "1.0-ml";
xdmp:set-response-content-type("text/html"),
<html>
<body>
<head>
<link rel="stylesheet" type="text/css" href="affect.css" />
</head>
<div class="container">
<div class="topNav">
<form method="GET" action="searchtest3.xqy" id="searchForm">
<input type="hidden" name="start" id="start" value="1"/>
<input type="text" name="search" size="43" maxlength="256" value=""/>
<input type="submit" name="button" value="search"/>
</form>
</div>
{let $searchTerm := xdmp:get-request-field("search")
let $query := cts:query(<cts:word-query xmlns:cts="http://marklogic.com/cts"><cts:text>{$searchTerm}</cts:text></cts:word-query>)
for $newresults in (//sect1|//sect2)
where cts:contains(($newresults//para), $query)
return
<div>
<a href="www.google.com<http://www.google.com><http://www.google.com>" class="searchResult">{$newresults/title/text()}</a>
{
for $para in $newresults/para
where cts:contains($para, $query)
return
<p>{cts:highlight($para[1],$query,<span class="highlight">{$cts:text}</span>)}</p>
}
</div>}
</div>
</body>
</html>
=======================================
Thanks for your help!
Chris
More information about the General
mailing list