有没有办法更改搜索 API 分面计数以显示总字数而不是匹配片段(文档)的计数?



我正在使用Marklogic 8和搜索API创建一个应用程序。我需要基于 MarkLogic 定义的集合创建分面,但分面计数不是提供包含执行的关键字搜索出现次数的片段(文档)数量的统计,我需要分面计数来反映关键字在集合中的所有文档中出现的总次数。

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

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

但是,我无法让它工作。

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

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

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

MarkLogic有关于其索引的出色文档,因此我建议从那里开始,以便更好地了解如何使用它们: https://docs.marklogic.com/guide/concepts/indexing#id_51573

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

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

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

最新更新