2012-09-28 3 views
1

Page1.xmlMarkLogic: wilcard recherche sur la gamme Element Index avec recherche: recherche

<pages xmlns="http://marklogic.com/docs"> 
    <page> 
    <elementNode>data1</elementNode> 
    <textNode>text1</textNode> 
    </page> 
    <page> 
    <elementNode>data2</elementNode> 
    <textNode>text2</textNode> 
    </page> 
    <page> 
    <elementNode>data3</elementNode> 
    <textNode>text3</textNode> 
    </page> 
    <page> 
    <elementNode>data4</elementNode> 
    <textNode>text4</textNode> 
    </page> 
</pages> 

J'ai créé un indice de gamme d'éléments sur elementNode, puis exécuté le XQuery suivant:

xquery version "1.0-ml"; 
declare namespace html = "http://www.w3.org/1999/xhtml"; 
declare namespace ts= "http://marklogic.com/docs"; 
import module namespace search ="http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy"; 

declare variable $options := 
    <options xmlns="http://marklogic.com/appservices/search"> 
    <searchable-expression xmlns:ex="http://marklogic.com/docs">//ex:page</searchable-expression> 
    <grammar> 
     <starter strength="30" apply="grouping" delimiter=")">(</starter> 
     <starter strength="40" apply="prefix" element="cts:not-query">NOT</starter> 
     <joiner strength="10" apply="infix" element="cts:or-query" tokenize="word">OR</joiner> 
     <joiner strength="20" apply="infix" element="cts:and-query" tokenize="word">AND</joiner> 
     <joiner strength="50" apply="constraint">:</joiner> 
    </grammar> 
    <constraint name="elementNode"> 
     <range collation="http://marklogic.com/collation/" type="xs:string"> 
     <facet-option>limit=1000</facet-option> 
     <element ns="http://marklogic.com/docs" name="elementNode"/> 
     <searchable-expression xmlns:ex="http://marklogic.com/clover/docs-xml">//ex:elementNode</searchable-expression> 
     </range> 
    </constraint> 
    </options>; 

let $searchResult := search:search("elementNode:(*data*)", $options) 
return $searchResult 

Dans le Au-dessus du cas, je n'obtiens aucun résultat car j'ai utilisé un astérisque de caractère générique [*] ici. Est-il possible d'activer la recherche de caractères génériques avec des contraintes de plage d'éléments? Merci d'avance.

Répondre

2

Les contraintes de plage utilisent cts:element-range-query(), ce qui permet la comparaison de valeurs, mais pas les caractères génériques. Cependant, cts:element-value-match() est conçu pour utiliser des expressions génériques, donc une solution consiste à construire une contrainte personnalisée avec cet appel API:

declare function parse(
    $constraint-qtext as xs:string, 
    $right as schema-element(cts:query)) 
as schema-element(cts:query) 
{ 
    let $vals := cts:element-value-match(
     xs:QName("elementNode"), 
     string($right//cts:text)) 
    return document { 
     cts:element-range-query(xs:QName("elementNode"),"=",$vals) }/* 
}; 

Et puis déclarer que dans votre noeud Options:

<options xmlns="http://marklogic.com/appservices/search"> 
    <constraint name="match-elementName"> 
     <custom facet="false"> 
      <parse apply="parse" ns="" at="/custom.xqy"/> 
     </custom> 
    </constraint> 
</options> 

Si vous ne 't ont besoin de l'indice de gamme, cependant, il pourrait être plus simple de créer un champ sur elementNode puis d'utiliser une contrainte de champ:

<constraint name="elementNode"> 
    <term-option>wildcarded</term-option> 
    <word> 
     <field name="field-elementNode"/> 
    </word> 
</constraint>