【问题标题】:Understanding range indexes in Marklogic了解 Marklogic 中的范围索引
【发布时间】:2013-11-23 00:07:05
【问题描述】:

我在 ML 文档中发现了以下内容: 范围索引让服务器将值映射到片段,并将片段映射到值……前者用于支持“范围谓词”……后者用于支持快速排序操作。 任何人都可以向我解释一下。描述如何维护此映射的某种图表将非常有帮助。

【问题讨论】:

    标签: indexing marklogic


    【解决方案1】:

    是的,请阅读 Jason 的优秀论文,了解 MarkLogic 内部工作的所有细节。

    范围索引的简单总结是这样的:范围索引是一个排序的术语列表。术语列表是存储在文档中的值的倒排索引。例如,对于单词索引,创建一个术语列表(术语列表),其中包含所有文档中的所有单词。列表中的每个术语都是一个单词,比如“humdinger”,以及该单词出现的一组相关片段 ID。当您对“humdinger”进行单词搜索时,ML 会检查术语列表以找出该单词出现在哪些片段中。很容易。更复杂的搜索只是所有适用术语列表中所有匹配术语的集合交集。

    大多数“常规”索引都没有排序,它们被组织为散列,以提高匹配项的效率。它们产生一组结果,但没有排序(之后应用相关性排序)。另一方面,范围索引是按其术语值排序的术语列表。因此,范围索引表示出现在数据库中元素或属性的所有实例中的唯一值的范围。

    因为范围索引术语列表是有序的,所以当您在搜索中获得匹配项时,您不仅知道它们出现在哪些片段中,还知道该字段可能值的排序顺序。 MarkLogic 的 XQuery 经过优化,可以识别您何时提供了“order by”子句,该子句引用了范围索引的元素或属性。这让它不是通过比较匹配的文档进行排序,而是通过向下迭代排序的术语列表并按该顺序获取匹配的文档。这使得它更快,因为文档本身不需要被触摸来确定它们的排序顺序。

    但是等等,还有更多。如果您正在对搜索结果进行分页,只获取匹配结果的一部分,那么按范围索引字段进行快速排序也可以帮助您。如果在应用页面窗口选择谓词之前注意不要访问文档的任何其他部分(范围索引元素除外),则永远不需要获取该窗口之外的文档。预排序选择和快速向前跳过的组合确实是您可以有效地逐步遍历大型排序结果集的唯一方法。

    范围索引还有一项有用的功能。您可以将它们的值作为词典访问,枚举整个数据库中给定元素或属性中出现的唯一值,但无需每个人实际查看任何文档。这对于自动建议和获取构面计数等事情非常有用。

    我希望澄清什么是范围索引。

    【讨论】:

    • 非常感谢。它澄清了很多。我想借此机会问一个相关的问题:cts:element-value-query() 如果为传递给查询的元素配置了元素范围索引吗?
    • 我不能肯定(我不再在 MarkLogic 工作),但没必要。无论如何,元素值总是被索引,因此不需要额外的范围索引来回答“哪些片段有这个值的元素?”这个问题。这就是 cts:element-value-query() 可以告诉您的,是/否,使用排序索引不会带来任何优势。话虽如此,MarkLogic 充分利用了所有可用索引,因此它们可能会在某些情况下发挥作用。
    • 进一步扩展:范围索引可以应用于 relative 元素值查询。也就是说,不是测试特定值的精确匹配(这是 cts:element-value-query() 所做的),而是查找小于、等于或大于某个给定值的元素/属性。例如,小于 1950 年的所有年份,或大于 30 的班级规模。范围索引的排序特性让 ML 可以非常快速地确定这一点。检查 cts:element-range-query() 的文档。
    • 再次感谢。我问这个问题是因为在我看来问题是“哪些片段有这个值的元素?”如果在排序后查看范围索引,则会得到更快的答案。
    【解决方案2】:

    看看 Jason Hunter 在Inside MarkLogic Server 中的文章。关于范围索引有一整节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-31
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多