2012-09-28 204 views
1

Page1.xmlMarklogic:Wilcard上元範圍索引搜索與搜索:搜索

<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> 

我已經創建上elementNode的元素範圍索引,則執行下面的XQuery:

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 

在以上情況我沒有得到任何結果,因爲我在這裏使用了通配符星號[*]。有什麼方法可以通過元素範圍約束來啓用通配符搜索?提前致謝。

回答

2

範圍約束使用cts:element-range-query(),它允許值比較,但不能使用通配符。然而,cts:element-value-match()設計使用通配符表達式,那麼一個解決方案是構建與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) }/* 
}; 

然後聲明,在你的選擇節點:

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

如果你不不需要範圍索引,但是,創建一個超過elementNode的字段然後使用字段約束可能會更簡單:

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