1

Page1.xml

<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

上記の場合、ここでワイルドカードのアスタリスク[*]を使用したため、結果が得られません。要素範囲の制約を使用してワイルドカード検索を有効にする方法はありますか?前もって感謝します。

4

1 に答える 1

2

範囲制約cts:element-range-query()では、値の比較はできますがワイルドカードはできません。ただし、cts:element-value-match()ワイルドカード式を使用するように設計されているため、1 つの解決策は、その 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>
于 2012-09-28T18:51:55.783 に答える