Xquery 如何在过滤条件下使用cts:values/cts:element属性值

Xquery 如何在过滤条件下使用cts:values/cts:element属性值,xquery,marklogic,Xquery,Marklogic,我有下面两个文档,范围索引是分别在数据类型string、string、string和integer的元素Id、名称、键和值上创建的 <Root Id='1'> <Name>ABC</Name> <Child> <Key>1</Key> <Value>10</Value> </Child> <Child> <Key>2</Key>

我有下面两个文档,范围索引是分别在数据类型string、string、string和integer的元素Id、名称、键和值上创建的

<Root Id='1'>
 <Name>ABC</Name>
 <Child>
  <Key>1</Key>
  <Value>10</Value>
 </Child>
 <Child>
  <Key>2</Key>
  <Value>20</Value>
 </Child>
</Root>

<Root Id='2'>
 <Name>ABC</Name>
 <Child>
  <Key>1</Key>
  <Value>20</Value>
 </Child>
 <Child>
  <Key>2</Key>
  <Value>10</Value>
 </Child>
</Root>
有没有一种方法可以根据过滤得到结果

注意:我不想使用cts:search,因为我的查询将返回超过100000条记录

关于$query的cts:element属性值的文档说明:

仅在cts:query选择的片段中包含值,并从这组包含的值中计算频率。这些值不需要与查询匹配,但必须出现在查询选择的片段中。不过滤片段以确保它们与查询匹配,而是以与未过滤的cts:search操作相同的方式进行选择。如果输入字符串,则该字符串将被视为指定字符串的cts:word查询

正如您已经注意到的,查询过滤器在未经过滤的情况下无法工作,因为它返回误报。cts:元素属性值也没有筛选选项

您可以尝试执行以下操作:

为子对象创建一个片段根。这允许您的查询在未经筛选的情况下运行,而不会返回误报

cts:element-attribute-values(xs:QName("Root"),xs:QName("Id"), (), (),
  cts:and-query((
      cts:element-value-query(xs:QName("Name"), "ABC"),
      cts:document-fragment-query(
        cts:element-query(xs:QName("Child"),
          cts:and-query((
              cts:element-value-query(xs:QName("Key"), "1"),
              cts:element-range-query(xs:QName("Value"), "<", 15)
          ))
       )
      )
    ))
)
关于我在这里所做的解释:

通过在子对象上创建片段根,每个子对象都保存在自己的片段中。这样,键和值上的and查询只返回片段,这些片段实际上包含给定的值。通过创建文档片段查询,您将检查文档是否包含所需的片段之一,因为跨片段搜索不起作用

希望这能有所帮助。

有关$query的cts:element属性值的文档说明:

仅在cts:query选择的片段中包含值,并从这组包含的值中计算频率。这些值不需要与查询匹配,但必须出现在查询选择的片段中。不过滤片段以确保它们与查询匹配,而是以与未过滤的cts:search操作相同的方式进行选择。如果输入字符串,则该字符串将被视为指定字符串的cts:word查询

正如您已经注意到的,查询过滤器在未经过滤的情况下无法工作,因为它返回误报。cts:元素属性值也没有筛选选项

您可以尝试执行以下操作:

为子对象创建一个片段根。这允许您的查询在未经筛选的情况下运行,而不会返回误报

cts:element-attribute-values(xs:QName("Root"),xs:QName("Id"), (), (),
  cts:and-query((
      cts:element-value-query(xs:QName("Name"), "ABC"),
      cts:document-fragment-query(
        cts:element-query(xs:QName("Child"),
          cts:and-query((
              cts:element-value-query(xs:QName("Key"), "1"),
              cts:element-range-query(xs:QName("Value"), "<", 15)
          ))
       )
      )
    ))
)
关于我在这里所做的解释:

通过在子对象上创建片段根,每个子对象都保存在自己的片段中。这样,键和值上的and查询只返回片段,这些片段实际上包含给定的值。通过创建文档片段查询,您将检查文档是否包含所需的片段之一,因为跨片段搜索不起作用


希望这有帮助。

每行有一个文档当然是最佳做法,但您也可以使用位置来解决此问题:如果在同一个cts:element查询中有两个值查询,并且启用了单词位置和范围位置,索引可以使用位置来解决此问题。

最好的做法当然是每行有一个文档,但也可以使用位置来解决此问题:如果在同一cts:element查询中有两个值查询,并且启用了单词位置和范围位置,索引可以使用位置来解决此问题。

我真的不建议使用分段来解决此问题。由于额外的连接,它不必要地减慢了搜索速度,并且由于文档中的片段边界,它使得查询更加不直观。Mary建议的启用位置更简单、更快,或者将每个孩子保存为一个单独的文档,并附带Mary提到的根级别信息的副本。我真的不建议使用碎片来解决这个问题。由于额外的连接,它不必要地减慢了搜索速度,并且由于文档中的片段边界,它使得查询更加不直观。按照Mary的建议启用职位更简单、更快,或者像Mary提到的那样,将每个孩子保存为一个单独的文档,并附上根级别信息的副本。。