【问题标题】:MarkLogic - Improving queryMarkLogic - 改进查询
【发布时间】:2017-01-26 01:30:33
【问题描述】:

作为后续问题:MarkLogic - getting distinct values

我有一个这样的文档结构:

<document>
<question_item>
  <question>What is your name?</question>
  <answer>Barney Rubble</answer>
</question_item>
<question_item>
  <question>What is your address?</question>
  <answer>Bedrock</answer>
</question_item>
...
</document>

感谢收到关于另一个问题的回答,我现在可以按频率顺序列出所有不同的问题:

 for $v in cts:element-values(xs:QName('question'), (), (),
    cts:element-word-query(xs:QName('question'), 'name'))
 where cts:contains($v, cts:word-query('name'))
 order by cts:frequency($v)
 return concat($v,concat("-",cts:frequency($v)))

我希望能够在每个不同的问题中包含最常见的 x 个答案及其数量,例如Barney Rubble (100)、Fred Flintstone (59) 等

有没有办法合理有效地做到这一点?我知道另一种选择是将文档格式更改为每个 question_item 有一个文档,但如果可能的话,我希望暂时避免这种情况。

非常感谢任何帮助。谢谢!

【问题讨论】:

  • Robert,如果您不需要扩展,这些功能很简单。关于您的体重秤的一些想法可以帮助我们回答这个问题。你大概有多少份文件?多少个节点?大约有多少会匹配原始查询?大约有多少会匹配第二个查询(“x 最常见的答案”)?您是否需要仅针对 gui 中可见的最热门匹配项显示第二个查询的答案?

标签: marklogic


【解决方案1】:

关键是为这种类型的分面利用单个范围索引。但是,当前模型需要过滤 - 使其无法实现您的目标。

以下是一些供您探索的选项。如果我不能改变我的模型,那么我可能会选择 1.1

选项 1)
为了回答这个问题,我可能考虑过对数据进行不同的建模(每个问题在单个文档中对不同问题的所有答案。然后使用单个范围索引,我可以通过将其视为一个方面来获得结果。(给出结果你想要通过内存索引。

选项 1.1)
您还可以保持数据原样,并在创建调查后仍创建这些面向方面的表格。非规范化数据在用于降低代码复杂性或提高性能等目的时还不错。

选项 2)
保留数据原样并在 question-item 元素上添加片段根。然后,这允许 MarkLogic 分别处理每个较小的 XML 片段。如果您在问题上添加一个范围索引,在答案上添加另一个索引,那么您可以快速迭代所有问题并获得您想要的分面答案。这将导致系统中的小片段数量爆炸式增长(每个答案一个)。这是一个可行的解决方案,但如果我可以重新建模数据,我会避免使用它。

选项 3)
如果您的问题数量有限,那么您还可以: 添加标识符以识别唯一问题:

   <question_item question-key="q1">
     <question>What is your address?</question>
     <answer>Bedrock</answer>
   </question_item>

然后对于每个问题,在路径上添加一个路径范围索引,例如:

//question-item[@question-key="q1"]/answer
//question-item[@question-key="q2"]/answer
...
//question-item[@question-key="qn"]/answer

然后,您可以针对每个答案应用分面方法。但正如您所看到的 - 如果问题的数量超过几个,这将变得很麻烦 - 近乎愚蠢。

【讨论】:

    【解决方案2】:

    只是为了详细说明大卫恩尼斯的答案,最终,如果您希望能够进行索引内“连接”,您可以根据另一个查询的结果查询答案,那么只有一个问题会更简单+ 每个文档/片段的答案。

    使用您当前的架构并给定一组问题值,如果您索引答案,您将从索引中获得的过滤级别将停止在您的文档/片段的粒度。因此,您只能列出“包含等于提供值的问题的任何文档中的每个答案”。然后,由于您的下一个过滤步骤是基于答案所属的问题,因此您被卡住了,因为您只有没有上下文的答案字符串。

    如果没有片段根或重构 XML,解决方案将涉及 1) 获取与问题列表匹配的每个文档,2) 从文档中过滤掉误报问题,以及 3) 计算答案。如果您希望第 1 步只返回少量文档,那么性能可能会很好。否则,您可能会看到 IO 抖动,其中数据未缓存并且必须从磁盘中检索。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多