我正在使用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()
以外的某些功能吗?或者我应该创建一个组合值/标签对并只搜索该字段的字段吗?
答案 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!