2012-10-16 3 views
0

나는 다음 두 XML 파일이 : 나는 요소의 범위를 만든MarkLogic : 잘못된 총 수

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

Page1.xml

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

Page2.xml "elementNode"에 대한 색인을 만들고 "page"요소를 조각 루트로 정의했습니다. 은 "총"search:response의 속성이 "3 당신이 여기에서 볼 수 있듯이 이제

<?xml version="1.0" encoding="UTF-8"?> 
<search:response total="3" start="1" page-length="10" xmlns="" xmlns:search="http://marklogic.com/appservices/search"> 
    <search:result index="1" uri="/content/C/Documents and Settings/vimleshm/Desktop/abc.xml" path="fn:doc(&quot;/content/C/Documents and Settings/vimleshm/Desktop/abc.xml&quot;)" score="22784" confidence="0.451657" fitness="0.663945"> 
    <search:snippet> 
     <search:match path="fn:doc(&quot;/content/C/Documents and Settings/vimleshm/Desktop/abc.xml&quot;)/*:pages/*:page[1]"> 
     <search:highlight>text1</search:highlight> 
     </search:match> 
     <search:match path="fn:doc(&quot;/content/C/Documents and Settings/vimleshm/Desktop/abc.xml&quot;)/*:pages/*:page[2]"> 
     <search:highlight>text1</search:highlight> 
     </search:match> 
    </search:snippet> 
    </search:result> 
    <search:result index="2" uri="/content/C/Documents and Settings/vimleshm/Desktop/abc1.xml" path="fn:doc(&quot;/content/C/Documents and Settings/vimleshm/Desktop/abc1.xml&quot;)" score="22784" confidence="0.451657" fitness="0.663945"> 
    <search:snippet> 
     <search:match path="fn:doc(&quot;/content/C/Documents and Settings/vimleshm/Desktop/abc1.xml&quot;)/*:pages/*:page[1]"> 
     <search:highlight>text1</search:highlight> 
     </search:match> 
    </search:snippet> 
    </search:result> 
    <search:facet name="elementNode"> 
    <search:facet-value name="data1" count="3">data1</search:facet-value> 
    </search:facet> 
    <search:qtext>text1</search:qtext> 
    <search:metrics> 
    <search:query-resolution-time>PT0S</search:query-resolution-time> 
    <search:facet-resolution-time>PT0.015S</search:facet-resolution-time> 
    <search:snippet-resolution-time>PT0S</search:snippet-resolution-time> 
    <search:total-time>PT0.015S</search:total-time> 
    </search:metrics> 
</search:response> 

: 나는 다음과 같은 응답을 얻었다 쿼리를 실행 한 후 검색 텍스트"텍스트 1 "

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"> 
    <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"/> 
     </range> 
    </constraint> 
    </options>; 
let $searchResult := search:search("text1", $options) 
return $searchResult 

다음과 같은 XQuery를 실행 "여기서 나는 페이지를 조각 루트로 정의했기 때문에 [Marklogic Wrong count and Facet result Xquery. 여기에 "text1"이 Page1.xml과 Page2.xml에만 있기 때문에 "2"가 될 올바른 총 수를 얻을 수있는 방법이 있습니까? 또한, 앞의 경우와 같이 두 개의 XML 파일에 존재하므로 "2"가되어야하는 count "3"이있는 패싯 "data2"가 있습니다. 이것 좀 도와주세요.

답변

3

조각 루트를 <pages> (또는 각 XML 문서의 루트에서 조각화가 기본값 임)으로 설정할 수 있습니다. 그러면 두 개의 조회가 발생합니다. 하나는 Page1.xml에 2 개의 일치 항목이 있고 다른 하나는 Page2.xml에서 1 매치. 그러나 조각 루트를 <page>으로 설정하면 검색에서 각 요소를 자체 문서로 처리하며 <pages> 대신 <page>을 계산합니다.

간단히 말하면, 결과 카운트는 프래그먼트 히트 수를 반영합니다. 따라서 질문은 실제로 무엇을 세고 싶습니까? 문서 또는 <page> s?

+0

실제로 전체 문서 또는 개별 페이지에서 검색 할 수 있으므로 사용자 쿼리에 따라 결과가 반환되어야합니다. 따라서 전체 문서 수 결과에서 검색 할 사용자의 선택이 "2"이어야합니다. · 제안하십시오. – user1660340

+0

@ user1660340 몇 가지 옵션이 있습니다. 1)''을 조각 내고 사용자 입력에 따라 옵션 노드를 바꿀 수 있습니다 :' // pages'. 그러나이 숫자는 많은 영향을받을 수 있습니다. 조각 만 정확하게 계산됩니다. 2) ''과 ''모두를 조각 낼 수 있지만 조상/자손 관계가있는 요소를 조각화하면 응용 프로그램에 다른 문제가 발생할 수 있습니다. 3) 내용을 복제하여 ''요소를 문서로 분리합니다. 이것은 항상 정확합니다. – wst

+0

제안 된 솔루션 (1)을 시도했지만 2 xml 파일에만 동일한 일치 항목이 있기 때문에 카운트가 "2"인 동안 총 카운트 "3"[프래그먼트 카운트]를 제공합니다. – user1660340