/*[itemMeta/url/@href eq $public_url]
is fully searchable on MarkLogic 5, but not 4.1 

dunno why

From: evan.l...@marklogic.com
To: general@developer.marklogic.com
Date: Wed, 11 Jan 2012 14:36:40 -0800
Subject: Re: [MarkLogic Dev General] Are xml attributes indexed by default




Or slightly more simply:
/*[itemMeta/url/@href eq $public_url]
However, I gave this to xdmp:plan() and, for some reason, it's not fully 
leveraging the indexes here, despite my assumption that it would. At index 
resolution, the above query selects all the XML documents in the database (same 
as /*).
It turns out xdmp:plan() is pretty essential here to figure out a formulation 
that works to fully leverage the indexes (even though they theoretically all 
should work).
The following reformulation is no better:
xdmp:plan(  collection()[/*/itemMeta/url/@href eq $public_url]/*)
However, strangely, the following (equivalent) reformulation hits the mark 
(selects 0 fragments in my database, which has no <itemMeta> elements):
xdmp:plan(  collection()[*/itemMeta/url/@href eq $public_url]/*)
And it's the only one that gives me this reassuring message: Step 1 predicate 1 
contributed 3 constraints: */itemMeta/url/@href eq "some_string"
Moral of the story is that xdmp:plan() is your friend. And the last query above 
is the most efficient.
Evan LenzSoftware Developer, CommunityMarkLogic 
Corporationhttp://developer.marklogic.com
From:  Geert Josten <geert.jos...@dayon.nl>
Reply-To:  General MarkLogic Developer Discussion 
<general@developer.marklogic.com>
Date:  Wed, 11 Jan 2012 13:47:33 -0800
To:  General MarkLogic Developer Discussion <general@developer.marklogic.com>
Subject:  Re: [MarkLogic Dev General] Are xml attributes indexed by default

Re: [MarkLogic Dev General] Are xml attributes indexed by defaultHi Jon, Your 
original expression was like this: /*[

    /*/itemMeta/url[@href=$public_url]
    ] That would return every root element in the database if there is any doc 
which meets the predicate expression. I think writing it as follows might 
improve things: /*[

    ./itemMeta/url[@href=$public_url]
    ] (note the period before /itemMeta) You could also use cts functions to 
explicitly rely on indexes: cts:search(collection(), 
cts:element-query(xs:QName(“itemMeta”), 
cts:element-attribute-value-query(xs:QName(“url”), xs:QName(“href”), 
$public_url)))/* Using CQ or Query Console Profile features, or functions like 
xdmp:plan can also help to pinpoint and analyze performance problems.. Kind 
regards,Geert Van: general-boun...@developer.marklogic.com 
[mailto:general-boun...@developer.marklogic.com] Namens Jonathan Cook - FM&T
Verzonden: woensdag 11 januari 2012 15:02
Aan: General MarkLogic Developer Discussion
Onderwerp: Re: [MarkLogic Dev General] Are xml attributes indexed by default 
Thanks for the reply,

In words I want to select the document that matches a given href eg return the 
whole document which matches itemMeta/url[@href=$public_url]

Xml could look like this:

<?xml version="1.0" encoding="UTF-8"?>

<story>  
  <itemMeta> 
    <url href="news/business-1234"/>  

    <assetTypeCode>STY</assetTypeCode>  

    <headline>Full Headline</headline>  

    <shortHeadline>Headline</shortHeadline>  

    <summary>Summary</summary>  

    <section id="1" name="Technology"/>  

    <firstCreated>2011-10-17T14:47:52+00:00</firstCreated>  

    <lastUpdated>2011-12-05T13:40:19+00:00</lastUpdated>  

    <publicationStatus>PUBLISHED</publicationStatus>  

    <language>en-GB</language>  

    <siteId>News v6</siteId>  

    <provider>cps</provider> 

  </itemMeta>  
  <pageOptions/> 

  <body/> 
  <media>
     <images/>
 </media> 

  <relatedGroups/> 
</story>

So you would want to return the whole story document. However other documents 
could have a different root node. ItemMeta will always exist under the root 
node with this structure so as you say I suspect there is a more efficient way 
of doing it.

I had a quick play with let $results := 
xinc:node-expand(//bbc:itemMeta/bbc:url[@href=$public_url]) but that just 
returns the actual url element not the whole document.

Thanks
Jon


On 11/01/2012 13:39, "Geert Josten" <geert.jos...@dayon.nl> wrote:Hi Jon,
 
You always have the Word index (Word lexicon), which can be explicitly used 
with cts:element-attribute-word-query (and the element counterpart 
cts:element-word-query. You will have to enable wildcard switches on the 
database to use wildcards within the searched values. If you want to lookup 
exact values, you might be better off with a range index, which can be 
explicitly used with cts:element-value-query and 
cts:element-attribute-value-query.

 
Whether or not XPath expressions are backed by these indexes and lexicons, 
depends how well the query optimizer is able to match them. You might be 
interested in this blog item from Evan, which explains how you can analyze this:

 
http://developer.marklogic.com/blog/learning-with-query-trace
 
However, I think you are asking something different here, looking at your code. 
To be honest, the argument of xinc:node-expand looks rather suspicious. /* 
accesses the entire database, but you do it a second time in the predicate. 
That is indeed very expensive. Can you put in words what you are trying to do? 
We might be able to suggest better ways of handling this..

 
Kind regards,
Geert
 

Van: general-boun...@developer.marklogic.com 
[mailto:general-boun...@developer.marklogic.com] Namens Jonathan Cook - FM&T
Verzonden: woensdag 11 januari 2012 12:56
Aan: general@developer.marklogic.com
Onderwerp: [MarkLogic Dev General] Are xml attributes indexed by default
 
Hi,

Are attributes indexed by default in Mark Logic Server? The documentation says 
the whole document structure is indexed but that doesn’t answer the question 
really.

For example I want to ensure the href attribute is indexed for the following 
xquery:
xquery version "1.0-ml";

import module namespace xinc = "http://marklogic.com/xinclude"; at 
"/MarkLogic/xinclude/xinclude.xqy";

let $public_url := "%s"

let $results := xinc:node-expand(/*[
    /*/itemMeta/url[@href=$public_url]
    ])

let $asset := $results[1]
return $asset

Perhaps the above xquery isn’t very efficient as I also read widcards couldn’t 
be used with indexes?

This option is set to false but I suspect this is something different:
“Index attribute value positions for faster near searches involving 
element-attribute-value-query (slower document loads and larger database 
files).”

Thanks
Jon 

http://www.bbc.co.ukThis e-mail (and any attachments) is confidential and may 
contain personal views which are not the views of the BBC unless specifically 
stated.If you have received it in error, please delete it from your system.Do 
not use, copy or disclose the information in any way nor act in reliance on it 
and notify the sender immediately.Please note that the BBC monitors e-mails 
sent or received.Further communication will signify your consent to 
this._______________________________________________
General mailing list
General@developer.marklogic.com
http://developer.marklogic.com/mailman/listinfo/general

http://www.bbc.co.uk/
This e-mail (and any attachments) is confidential and may contain personal 
views which are not the views of the BBC unless specifically stated.
If you have received it in error, please delete it from your system.

Do not use, copy or disclose the information in any way nor act in reliance on 
it and notify the sender immediately.
Please note that the BBC monitors e-mails sent or received.
Further communication will signify your consent to this.

     

_______________________________________________
General mailing list
General@developer.marklogic.com
http://developer.marklogic.com/mailman/listinfo/general                         
                  
_______________________________________________
General mailing list
General@developer.marklogic.com
http://developer.marklogic.com/mailman/listinfo/general

Reply via email to