0

呼び出しsearch:searchによって、予想されるファセット結果の数が返されません。以下は、2 つのサンプル ファイルと私が使用したコードです。

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>

Page2.xml

<pages xmlns="http://marklogic.com/docs">
  <page>
    <elementNode>data5</elementNode>
    <textNode>text5</textNode>
  </page>
  <page>
    <elementNode>data6</elementNode>
    <textNode>text6</textNode>
  </page>
  <page>
    <elementNode>data7</elementNode>
    <textNode>text7</textNode>
  </page>
  <page>
    <elementNode>data8</elementNode>
    <textNode>text8</textNode>
  </page>
</pages>

また、 に要素範囲インデックスを作成しました<elementNode>。今、searchText " text1 " で次の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("text1", $options)
return $searchResult

これにより、次の結果が生成されます。

<search:response xmlns="" xmlns:search="http://marklogic.com/appservices/search">
  <search:result index="1" uri="Page1.xml" path="fn:doc(&quot;Page1.xml&quot;)/*:pages/*:page[1]">
    <search:snippet>
      <search:match path="fn:doc(&quot;Page1.xml&quot;)/*:pages/*:page[1]/*:textNode">
        <search:highlight>text1</search:highlight>
      </search:match>
    </search:snippet>
  </search:result>
  <search:facet name="elementNode">
    <search:facet-value name="data1" count="1">data1</search:facet-value>
    <search:facet-value name="data2" count="1">data2</search:facet-value>
    <search:facet-value name="data3" count="1">data3</search:facet-value>
    <search:facet-value name="data4" count="1">data4</search:facet-value>
  </search:facet>
</search:response>

で問題が発生していfacet-resultます。page1のみが目的の検索式 " text1 " を持っているため、 1つのファセット値、つまり page1 からの data1 のみを返す必要があります。代わりに、ドキュメント全体からのすべての textNode 値の結果が得られます。助けてください -- どうすればこれを制限できますか? また、カウントはドキュメント全体に対して私に与えていますが、私が望むのはページ数の一致です。facet-result

4

2 に答える 2

1

インデックスは、要素ではなく、ドキュメントまたはフラグメントを指します。これは、インデックスが行を指す RDBMS に似ています。サンプルの XML とコードは、各ドキュメントをリレーショナル テーブルのようなものと考えていることを示唆しています。代わりに、ドキュメントを行と考えてください。

サンプル コードが実際のアプリケーションに似ている場合は、ドキュメントをリファクタリングして、各「ページ」要素が独自のドキュメントになるようにします。

また、 のような名前空間を使用して独自のコンテンツを作成することもお勧めできませんhttp://marklogic.com/docs。MarkLogic は、将来のリリースでその名前空間を使用することを決定する可能性があり、それによって問題が発生する可能性があります。制御することが合理的に期待できる名前空間を選択してください。

于 2012-09-16T01:46:08.853 に答える
1

searchable-expression を使用すると、検索結果がそれらの要素に分割されます。残念ながら、mblakele が説明しているように、ファセット数の場合はそうではありません。ページ要素を独自のドキュメントに配置するという彼の提案は、ここで考えられる 2 つの解決策の 1 つです。もう 1 つは、ページ要素をフラグメント ルートとして定義することです。これは、MarkLogic の管理インターフェイスで行うことができます。データベースのプロパティで見つけることができます。

チッ!

于 2012-09-16T06:37:48.317 に答える