在同一元素中搜索

时间:2017-07-08 09:32:27

标签: xml xquery marklogic marklogic-7

我必须根据两个属性及其元素值搜索xml。为此,我使用了cts:near-query,距离为零。但我得到的xml不包含匹配值。我在设置中启用了位置值并完成了重建索引。请找到以下XML 不匹配的XML:

<cars>
  <car a="subject" b="89">Indian Bank</car>
  <car a="subject" b="79">Central Banks</car>
  <car a="subject" b="90">Coriando banks</car>
</cars>

我的查询类似于cts:near-query,其中包含两个属性范围查询a=subjectb>=89以及一个元素字查询central banks,距离为零。我不希望在搜索时返回此XML。请帮我解决这个问题。

确切的规则: 在搜索时应返回包含a = subject和b&gt; = 89以及中央银行的元素值的XML。但是在评论中使用以下查询获取上述文档。

cts:and-query((
  cts:near-query((
    cts:element-attribut‌​e-range-query(xs:QNa‌​me("car"), xs:QName("‌​b), ">=", 89),
    cts:elem‌​ent-attribute-range-‌​query(xs:QName("car"‌), xs:QName("a), "=", "‌subject"),
    cts:elemen‌​t-word-query(xs:qnam‌​e("car"), "Central Banks")
  ),0)
))

1 个答案:

答案 0 :(得分:1)

这样可行:

xdmp:document-insert("/cars.xml",
<cars>
  <car a="subject" b="89">Indian Bank</car>
  <car a="subject" b="79">Central Banks</car>
  <car a="subject" b="90">Coriando banks</car>
</cars>)
;
let $car := xs:QName("car")
let $a := xs:QName("a")
let $b := xs:QName("b")
return
cts:search(collection()/cars/car, cts:element-query($car, cts:and-query((
  cts:element-attribute-value-query($car, $a, "subject"),
  cts:element-attribute-value-query($car, $b, "79"),
  cts:word-query("Central Banks")
))))

您可以使用元素查询将子查询约束到特定元素,通常比近查询更好(这也需要启用位置索引)。

元素名称与父元素查询匹配的属性值查询将包含元素查询中元素的属性。我没有关于属性ab的范围索引,但这同样适用于属性范围查询。

元素查询中的其他元素范围/值/单词查询但是,仅适用于后代。因此,您需要使用单词查询来查看元素的内容。

指向特定汽车的可搜索表达式将隔离与查询匹配的确切汽车。请注意,这需要过滤,这通常会减慢搜索速度。如果您将每辆车保存在单独的文档中,则可以进行未经过滤的搜索以获得更好的性能。它也可能会提升对包装元素查询的需求。

HTH!