0

我必须根据两个属性和它的元素值来搜索 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>=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)
))
4

1 回答 1

2

这会起作用:

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")
))))

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

元素名称与父元素查询匹配的属性值查询将包括来自元素查询的元素的属性。a我在属性和上没有范围索引b,但同样适用于属性范围查询。

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

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

于 2017-07-08T16:02:42.450 回答