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

问题描述 投票:1回答:1

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

现在,我正在使用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-search marklogic
1个回答
1
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.