有没有快速的方法来找到与cts匹配的父节点:element-value-match()?

时间:2017-05-24 14:33:47

标签: xpath indexing xquery marklogic query-performance

我正在使用cts:element-value-match()在一大堆icd-10代码中找到一个值(超过70K项)。由于我们使用字符串范围索引,因此结果很快返回。

项目的结构如下所示:

<item>
   <value>E232</value>
   <label>Diabetes insipidus</label>
<item>

以下是我如何调用cts:element-value-match()

的示例
cts:element-value-match(xs:QName("label"), '*diabetes*', $options)

但是,cts:element-value-match()只返回值字符串。现在我需要一种快速的方法来找出这个值的父节点。我似乎唯一能做到这一点的方法是使用非常慢的XPath表达式,并将字符串与文档中的每个标签进行比较。

let $value:= /codes/items/item[label = $label]/value

有没有办法从结果字符串中获取父节点?如果没有,我应该使用除cts:element-value-match()以外的某些功能吗?或者我应该创建一个组合值/标签对并只搜索该字段的字段吗?

3 个答案:

答案 0 :(得分:1)

XPath不一定很慢,但确实涉及获取文档。有可能以某种方式利用缓存。如果需要,可以使用doc('/mycodes.xml')/codes/items/item[label = 'somelabel']/value来帮助使用xdmp:value等模式。

但是,更好的方法可能是重新考虑如何存储商品。如果将每个文件存储在单独的文件中,则可以使用共现来提取值及其标签。

如果有理由不想触及您的代码结构,并且您可以使用MarkLogic 9,您还可以考虑使用TDE构建一个视图,其中每个项目占用一行,并使用SQL或Optic API查询它。

HTH!

答案 1 :(得分:1)

我不确定为什么你开始使用值匹配与范围查询,如果你需要超过值的开头。

您是否尝试使用可搜索的表达式并使用cts确定xpath的范围:element-value-range-query()

类似的东西:

cts:search(doc()/elements/element, cts:element-value-query(xs:QName("label"), '=', '*diabetes*')

返回:

<item>
   <value>E232</value>
   <label>Diabetes insipidus</label>
<item>

如果你在item元素上有一个片段根,那么这应该是非常有效的。但是,我建议您考虑权衡片段根与重构数据。

你还提到你考虑过三元组。三元组有一个三范围查询,可以工作。

回到我的第一个声明 - 如果上面的说法有效,那么最后在范围索引中可能没什么价值,因为你可以通过元素字查询影响通用索引上的通配符,实例

答案 2 :(得分:1)

谢谢你们的建议。我没有意识到在cts:search的第一个参数的末尾添加一个XPath表达式会加快查询速度。但只要我没有使用未经过滤的选项,它确实有效!我也尝试使用cts:element-value-match()和cts:word-query(),发现单词查询更快。

我还发现添加cts:index-order()加快了结果。

以下是我的最终查询:

let $q := xdmp:get-request-field('q', 'diabetes') let $start := xs:positiveInteger(xdmp:get-request-field('start', '1')) 
let $page-length := xs:positiveInteger(xdmp:get-request-field('start', '10'))
let $end := $start + $page-length - 1

let $results := cts:search(doc('/reference-data/icd-10-codes.xml')/codes/items/item, cts:word-query($q), ("filtered", cts:index-order(cts:element-reference(xs:QName("label")))))[$start to $end]

这会将结果返回到大约1/10秒的HTML表视图,这对于我的&#34;价值演示来说已经足够了。阶段。

我注意到我必须使用&#34;过滤&#34;选项。 &#34;未经过滤的&#34;如果将根元素用作cts:search()函数的第一个参数,则选项似乎只能起作用。所以我想完整的ICD-10文档仍然被加载到电子节点中。

如果生产中1/10秒太长,我们可以将文件分成70K小文件。

再次感谢Mads和David!