在我的数据库

时间:2017-02-14 12:37:20

标签: xquery marklogic marklogic-8

我通过MLCP命令在我的数据库中插入了200000 xml文档(大约总大小为1GB)。现在我想在针对该数据库的搜索查询下运行(在admin api 中使用默认索引设置的数据库)以获取所有文档。

let $options :=
 <options xmlns="http://marklogic.com/appservices/search">
  <search-option>unfiltered</search-option>
  <term>
    <term-option>case-insensitive</term-option>
  </term>
  <constraint name="Title">
      <range collation="http://marklogic.com/collation/" facet="true">
       <element ns="http://learning.com" name="title" />
      </range>
  </constraint>
  <constraint name="Keywords">
      <range collation="http://marklogic.com/collation/" facet="true">
       <element ns="http://learning.com" name="subjectKeyword" />
      </range>
  </constraint>
  <constraint name="Subjects">
      <range collation="http://marklogic.com/collation/" facet="true">
       <element ns="http://learning.com" name="subjectHeading" />
      </range>
  </constraint>
  <return-results>true</return-results>
  <return-query>true</return-query>
</options>
let $result := search:search("**", $options, 1, 20)
return $result

范围索引: -

      <range-element-index>
      <scalar-type>string</scalar-type>
      <namespace-uri>http://learning.com</namespace-uri>
      <localname>title</localname>
      <collation>http://marklogic.com/collation/</collation>
      <range-value-positions>false</range-value-positions>
      <invalid-values>ignore</invalid-values>
    </range-element-index>
      <range-element-index>
      <scalar-type>string</scalar-type>
      <namespace-uri>http://learning.com</namespace-uri>
      <localname>subjectKeyword</localname>
      <collation>http://marklogic.com/collation/</collation>
      <range-value-positions>false</range-value-positions>
      <invalid-values>ignore</invalid-values>
    </range-element-index>
          <range-element-index>
      <scalar-type>string</scalar-type>
      <namespace-uri>http://learning.com</namespace-uri>
      <localname>subjectHeading</localname>
      <collation>http://marklogic.com/collation/</collation>
      <range-value-positions>false</range-value-positions>
      <invalid-values>ignore</invalid-values>
    </range-element-index>

在每个xml文档中,主题词和标题值都是

<lmm:subjectKeyword>anatomy, biology, illustration, cross, section, digestive, human, circulatory, body, small, neck, head, ear, torso, veins, teaching, model, deep, descending, heart, brain, muscles, lungs, diaphragm, c</lmm:subjectKeyword><lmm:title>CORTY_EQ07-014.eps</lmm:title>

但是它甚至花了很多时间查询控制台说渲染的元素太多解析器错误:无法解析结果。文件大小太大

3 个答案:

答案 0 :(得分:4)

我还要补充说,如果你想获取所有文件(我不建议在非平凡的数据库上)直接执行它而不是通配符搜索会更有效:{{1} (或者,正如Geert建议的那样,分页:fn:doc()

答案 1 :(得分:3)

首先,不要试图立即获取所有文件。这意味着MarkLogic必须为每个文档,进程和序列化转到磁盘,最后但并非最不重要的是,客户端也需要接收和显示它。后者可能是这里的瓶颈。这通常是用户应用程序一次显示10或20个搜索结果的原因。换句话说:使用分页。

我还建议不经过滤运行以获得更好的性能。

HTH!

答案 2 :(得分:2)

分页绝对是关键所在,我对你的方面感到好奇。从你的例子中,我想象&#34; Title&#34;在您的200k文档中几乎总是唯一的。并且lmm:subjectKeyword元素似乎需要一些后期处理才能使其作为一个方面更有用 - 它是一串逗号分隔的值,这意味着subjectKeyword几乎总是也是唯一的(我建议每个将这些值放入一个单独的元素中,这将作为一个方面更有用)。而且我猜测主题主题也是独一无二的。

当你有一组有界的值时,平面通常很有用 - 例如对于笔记本电脑,有界套装包括制造商,显示器尺寸和价格范围的水桶。一旦你进入数百个值,一个方面的实用程序会减少用户 - 有多少用户真的想要对数百或数千个值进行排序以找到他们想要的内容?在你的情况下,我们可能会谈论成千上万的唯一值,如果不是20万个唯一值(特别是&#34; Title&#34;)。而且 - 当你拥有那么多独特的价值时,分面解决时间会花费更长的时间。

所以在探讨方面解决时间之前 - 你试图用这3个方面解决什么问题?

在不了解更多内容的情况下,我将subjectKeyword元素后处理为多个元素,每个元素中都包含一个关键字,然后在该元素上添加一个方面。理想情况下,你有几十个关键字,可能有数百个关键字,解决这个方面应该非常快。