首页 > 解决方案 > 有没有办法更改 Search API 方面计数以显示总字数而不是匹配片段(文档)的计数?

问题描述

我正在使用 Marklogic 8 和搜索 API 创建一个应用程序。我需要基于 MarkLogic 定义的集合创建构面,但我需要构面计数来反映总数关键字出现在集合中的所有文档中的次数。

现在,我正在使用 search:search() 来处理查询并返回一个启用了 facet 选项的元素。

在 MarkLogic 文档中,我一直在查看 cts:frequency() ,它说:“如果您想要总频率而不是基于片段的频率(即,在指定的项目中的值的出现总数)词典 API 的 cts:query 选项),您必须为输入到 cts:frequency 的词典 API 值指定 item-frequency 选项。”

但是,我无法让它发挥作用。

我试过在查询控制台中运行这样的查询,但它超时了。

cts:element-values(QName("http://www.tei-c.org/ns/1.0", "TEI"),
"", "item-frequency",   
 cts:and-query((
    fn:collection("KirchlicheDogmatik/volume4/part3"),
    cts:word-query("lehre"))))

标签: full-text-searchmarklogic

解决方案


问题可能是您有一个范围索引 on <TEI>,其中包含整个文档。范围索引是内存映射的,因此您实际上已将数据库的完整文本内容强制到内存中。很难确切地说出发生了什么,但它可能很难检查值(范围索引是为较小的原子值设计的)并可能交换到磁盘。

MarkLogic 在其索引方面有很好的文档,所以我建议从那里开始更好地了解如何使用它们:https ://docs.marklogic.com/guide/concepts/indexing#id_51573

请注意,即使使用该item-frequency选项,结果(或计数)也不能保证与“关键字出现的总次数”是一对一的。它将报告“项目”匹配的数量 - 在您的示例中,它将报告<TEI>匹配的元素数量。

在整个数据库中获得与查询匹配的术语的准确计数问题实际上非常困难。要在文档中获得完全匹配的值,您需要使用cts:highlightor cts:walk,这需要将整个文档加载到内存中。这通常适用于文档子集,但最终要获得整个数据库的准确值,您需要将整个数据库加载到内存中并处理每个文档。

几乎任何获取术语匹配计数的方法都需要某种近似值,并且在很大程度上取决于您的标记。例如,如果您索引<p>(甚至更好<s>)元素,则可以构建一个使用索引来计算匹配段落(或句子)数量的查询,但这仍然会将大量数据加载到内存中,并且把它放在那里。如果您愿意分配足够的内存(和/或足够的服务器),这在技术上是可行的,但这似乎并不值得。


推荐阅读