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



我正在使用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()之外,我应该使用其他功能吗? 还是应该创建一个组合值/标签对的字段并仅搜索该字段?

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

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

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

哼!

如果您一开始需要的值超过值,我不确定为什么您从值匹配与范围查询开始。

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

像这样:

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

返回:

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

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

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

回到我的第一个陈述 - 如果上述有效,那么最终范围索引的价值可能很小,因为例如,您可以使用元素-单词查询来影响通用索引上的通配符。

谢谢你们的建议。 我没有意识到在 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 表视图,这对于我的"价值演示"阶段来说已经足够了。

我注意到我必须使用"过滤"选项。 "未过滤"选项似乎仅在根元素用作 cts:search() 函数的第一个参数时才有效。 所以我猜完整的ICD-10文档仍在加载到电子节点中。

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

再次感谢麦德斯和大卫!

最新更新