在我的数据库中插入大量 xml 文件后,marklogic 8 查询性能下降

marklogic 8 query performance down after inserting large number xml files in my database

我通过 MLCP 命令在我的数据库中插入了 200000 xml 个文档(大约总大小 1GB)。现在我想运行下面针对该数据库的搜索查询(在管理员中设置默认索引的数据库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>

但是即使查询控制台说 要呈现的元素太多解析器错误:无法解析结果也需要很多时间。文件太大

首先,不要试图一次获取所有文档。这将意味着 MarkLogic 将不得不为每个文档、进程进入磁盘并将其序列化,最后但并非最不重要的一点是,client-side 也需要接收和显示。后者大概就是这里的bottle-neck。这通常是用户应用程序一次显示 10 或 20 个搜索结果的原因。换句话说:使用分页。

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

HTH!

我还要补充一点,如果您想获取所有文档(我不建议在 non-trivial 数据库中这样做)直接执行而不是作为通配符搜索会更有效: fn:doc()(或者,正如 Geert 所建议的那样,分页:fn:doc[1 to 20]

分页绝对是这里的关键,我很好奇你的方面。根据您的示例,我想 "Title" 在您的 200k 文档中几乎总是唯一的。 lmm:subjectKeyword 元素似乎需要一点 post-processing 才能使它作为一个方面更有用 - 它是一个 comma-delimited 值的字符串,这意味着 subjectKeyword 也几乎总是唯一的(我建议将这些值中的每一个都放入一个单独的元素中,这作为一个方面会更有用)。而且我猜 subjectHeading 大部分也是独一无二的。

当您拥有一组有界值时,分面通常很有用 - 例如对于笔记本电脑,有界集包括制造商、显示器尺寸和价格范围。一旦你进入数百个值,一个方面的效用对用户来说就会降低——有多少用户真的想在数百或数千个值中进行排序以找到他们想要的东西?在您的情况下,我们可能谈论的是数万个唯一值,如果不是 200k 个唯一值(特别是 "Title")。并且 - 当您拥有那么多唯一值时,方面解析时间将花费更长的时间。

那么在探索方面解决时间之前 - 您试图用这 3 个方面解决什么问题?

在一无所知的情况下,我将该 subjectKeyword 元素 post-process 分成许多元素,每个元素中都有一个关键字,然后在该元素上放置一个构面。理想情况下,您有几十个关键字,也许数百个,并且解决该方面应该非常快。