MarkLogic-改进查询

MarkLogic-改进查询,marklogic,Marklogic,作为问题的后续: 我的文档结构如下: <document> <question_item> <question>What is your name?</question> <answer>Barney Rubble</answer> </question_item> <question_item> <question>What is your address?</ques

作为问题的后续:

我的文档结构如下:

<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>
我希望能够在每个不同的问题中包括前x个最常见的答案及其数量,例如Barney Bruse(100)、Fred Flintstone(59)等

有没有一种方法可以合理有效地做到这一点?我知道另一个选择是更改文档格式,使每个问题项有一个文档,但如果可能的话,我希望暂时避免这样做


非常感谢您的帮助。谢谢

关键是为这种刻面类型利用单一范围索引。然而,当前的模型需要过滤,这使得它对您的目标效率低下

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

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

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

选项2)
保持数据不变,并在问题项元素上添加一个片段根。这样,MarkLogic就可以分别处理这些较小的XML片段。如果您在问题上添加一个范围索引,在答案上添加另一个范围索引,那么您可以快速迭代所有问题,并获得您想要的分面答案。这将导致系统中的小碎片数量爆炸(每个答案一个)。这是一个可行的解决方案,但如果我可以对数据重新建模,我将避免这种解决方案

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

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

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

关键是利用单一范围索引进行这类刻面。然而,当前的模型需要过滤,这使得它对您的目标效率低下

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

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

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

选项2)
保持数据不变,并在问题项元素上添加一个片段根。这样,MarkLogic就可以分别处理这些较小的XML片段。如果您在问题上添加一个范围索引,在答案上添加另一个范围索引,那么您可以快速迭代所有问题,并获得您想要的分面答案。这将导致系统中的小碎片数量爆炸(每个答案一个)。这是一个可行的解决方案,但如果我可以对数据重新建模,我将避免这种解决方案

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

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

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

仅就David Ennis的答案进行详细说明,最终,如果你想能够在索引“连接”中进行操作,在索引“连接”中,你可以根据另一个查询的结果查询答案,每个文档/片段只有一个问题+答案会更简单

使用当前模式并给定一组问题值,如果对答案进行索引,则从索引中获得的过滤级别将停止在文档/片段的粒度上。因此,您只能列出“任何文档中包含与所提供值相等的问题的每个答案”。然后,由于您的下一个筛选步骤基于答案所属的问题,您将陷入困境,因为您只有答案字符串,没有上下文


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

请详细说明David Ennis的答案,最终,如果您希望能够在索引“连接”中根据另一个查询的结果查询答案,那么每个文档/片段只有一个问题+答案会更简单

使用当前模式并给定一组问题值,如果对答案进行索引,则从索引中获得的过滤级别将停止在文档/片段的粒度上。因此,您只能列出“任何文档中包含与所提供值相等的问题的每个答案”。然后,由于您的下一个筛选步骤基于答案所属的问题,您将陷入困境,因为您只有答案字符串,没有上下文

如果没有片段根或重构XML,解决方案将涉及1)获取与问题列表匹配的每个文档,2)从文档中过滤出假阳性问题,以及3)计算答案。如果您希望步骤1只返回一个小的
//question-item[@question-key="q1"]/answer
//question-item[@question-key="q2"]/answer
...
//question-item[@question-key="qn"]/answer