2015-04-17 216 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

感谢您的建议,我会研究它,即使我需要在每次新的页面加载时重新进行内存中的聚合计算。 –