2015-04-17 207 views
0

我使用search:search來檢索相當大的一組數據(0.5K到3K)來繪製一些圖表,並且還使用搜索API中的方面好處來允許最終用戶對數據集進行分面過濾,然後動態重建圖表。從數據庫中獲取數據並將數據提取到客戶端Web應用會花費大約5-10秒的時間(當數據集較小時減少),這對最終用戶來說並不令人愉快。我知道這是一個概念性問題,允許用戶輕鬆塑造被繪製的數據和這個過程的速度之間的平衡/妥協,但是,請大家非常感謝任何幫助/提示。謝謝!提高搜索速度性能的提示:搜索結果檢索?

PS:我使用search:parse,然後將查詢傳遞給cts:query嘗試提出了這樣的錯誤:[1.0-ml] XDMP-NONMIXEDCOMPLEXCONT: fn:data(<cts:and-query qtextjoin="AND" strength="20" qtextgroup="()" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:cts="http://marklogic.com/cts"><cts:element-range-query qtextpre="Jaar:" qtextref="cts:annotati...</cts:and-query>) -- Node has complex type with non-mixed complex content

選項:

<search:options xmlns:search="http://marklogic.com/appservices/search"> 
    <search:search-option>filtered</search:search-option> 
    <search:page-length>3050</search:page-length> 
    <search:term apply="term"> 
    <search:empty apply="all-results"/> 
    <search:term-option>punctuation-insensitive</search:term-option> 
    <search:term-option>unstemmed</search:term-option> 
    </search:term> 
    <search:grammar> 
    <search:quotation>"</search:quotation> 
    <search:implicit> 
     <cts:and-query strength="20" xmlns:cts="http://marklogic.com/cts"/> 
    </search:implicit> 
    <search:starter strength="30" apply="grouping" delimiter=")">(</search:starter> 
    <search:starter strength="40" apply="prefix" element="cts:not-query">-</search:starter> 
    <search:joiner strength="10" apply="infix" element="cts:or-query" tokenize="word">OR</search:joiner> 
    <search:joiner strength="20" apply="infix" element="cts:and-query" tokenize="word">AND</search:joiner> 
    <search:joiner strength="30" apply="infix" element="cts:near-query" tokenize="word">NEAR</search:joiner> 
    <search:joiner strength="30" apply="near2" consume="2" element="cts:near-query">NEAR/</search:joiner> 
    <search:joiner strength="50" apply="constraint">:</search:joiner> 
    <search:joiner strength="50" apply="constraint" compare="LT" tokenize="word">LT</search:joiner> 
    <search:joiner strength="50" apply="constraint" compare="LE" tokenize="word">LE</search:joiner> 
    <search:joiner strength="50" apply="constraint" compare="GT" tokenize="word">GT</search:joiner> 
    <search:joiner strength="50" apply="constraint" compare="GE" tokenize="word">GE</search:joiner> 
    <search:joiner strength="50" apply="constraint" compare="NE" tokenize="word">NE</search:joiner> 
    </search:grammar> 
    <search:additional-query> 
    <cts:not-query xmlns:cts="http://marklogic.com/cts"> 
     <cts:or-query> 
    <cts:collection-query> 
     <cts:uri>All_Intakes</cts:uri> 
     <cts:uri>Reports</cts:uri> 
    </cts:collection-query> 
    <cts:element-query> 
     <cts:element xmlns:sem="http://marklogic.com/semantics">sem:triples</cts:element> 
     <cts:or-query/> 
    </cts:element-query> 
     </cts:or-query> 
    </cts:not-query> 
    </search:additional-query> 
    <search:debug>false</search:debug> 
    <search:extract-metadata> 
    <search:qname elem-name="USER_EI"/> 
    <search:qname elem-name="Customer"/> 
    <search:qname elem-name="TOTALAMOUNTTENANTEI"/> 
    <search:qname elem-name="TOTALAMOUNTTENANTEI2"/> 
    <search:constraint-value ref="Medewerker"/> 
    <search:constraint-value ref="Klant"/> 
    <search:constraint-value ref="TOTALAMOUNTTENANTEI"/> 
    <search:constraint-value ref="TOTALAMOUNTTENANTEI2"/> 
    </search:extract-metadata> 

    <search:transform-results apply="snippet"/> 
    <search:constraint name="Klant"> 
    <search:range type="xs:string" collation="http://marklogic.com/collation/"> 
     <search:element name="Customer"/> 
    </search:range> 
    </search:constraint> 
    <search:constraint name="Medewerker"> 
    <search:range type="xs:string" collation="http://marklogic.com/collation/"> 
     <search:element name="USER_EI"/> 
    </search:range> 
    </search:constraint> 
    <search:constraint name="Jaar"> 
    <search:range type="xs:int"> 
     <search:element name="Operation_Year"/> 
    </search:range> 
    </search:constraint> 
    <search:constraint name="Kwartaal"> 
    <search:range type="xs:int"> 
     <search:element name="Operation_Quarter"/> 
    </search:range> 
    </search:constraint> 

    <search:return-metrics>true</search:return-metrics> 
    <search:return-qtext>true</search:return-qtext> 
    <search:return-query>false</search:return-query> 
    <search:return-results>true</search:return-results> 
    <search:return-similar>false</search:return-similar> 
    <search:sort-order direction="descending"> 
    <search:score/> 
    <search:annotation>Relevancy (Desc)</search:annotation> 
    </search:sort-order> 
</search:options>; 
+0

嗨Lenti ...你可以發佈你使用的搜索API選項嗎?另外,你使用的是什麼版本的MarkLogic? –

+0

在我的開發機器上,我使用ML 7,並在公共測試服務器上升級到ML 8. –

回答

2

您提到想要繪製圖表並創建構面。兩者都將基於價值而不是完整的文件。這聽起來像你可以返回,例如,10個文檔值,但從你的方面得到更大的列表。看起來您目前正在從提取元數據中獲取值。這是獲取某些信息以顯示個別搜索結果的好方法,但不是獲取有關數據集摘要信息的好方法。

您的約束條件都使用範圍索引,這很好 - 這些都會很快得到解決。對於您的圖表,您可能想要使用/ v1 /值來獲得同現值。

我想你的頁面長度更改爲10,並添加<小選項>上限= 100 < /小選項>到面,然後從面的,而不是提取元數據讓您的圖表值。此外,如果您可以安排索引以便unfiltered searches提供準確的結果,那麼您的搜索將運行得更快。

2

聽起來像你試圖抓住完整的搜索結果在一頁中(start = 1 page-length = 99999999)。您可能希望將策略更改爲以較小的批次(page-length = 100?)獲取結果,並且只是遍歷頁面,並動態地將越來越多的節點附加到圖表。一個好的圖表庫應該支持這一點。

HTH!

+0

事實上,我的客戶要求採用這種策略,在開始時獲取所有數據,然後使用方面縮小範圍過濾器。我會試着用另一種方式說服他,先從少量數據開始,並且只需要偶爾需要一次,以便獲得更多的數據進行繪圖,接受限制和績效收費。 –

+0

我不一定是指延遲加載數據,只是意味着分批進行。您可以在彼此之後直接迭代頁面。加載所有數據點可能需要幾秒鐘,也許更多,但用戶體驗會更好;你會看到數據幾乎立即顯示,只是一個漸進的增量。 – grtjn

+0

感謝您的建議,我會研究它,即使我需要在每次新的頁面加載時重新進行內存中的聚合計算。 –