1

我正在使用 Marklogic 工具,我有一个包含大约 27000 个文档的数据库。我想要做的是检索在任何搜索查询结果给出的文档中频率最高的关键字。我目前正在使用 xquery 函数来计算作为查询结果检索到的所有文档集中每个单词的频率。然而,这是非常低效的。我在想,如果我能获得 marklogic 执行索引的单词列表,这将对我有所帮助。那么有没有办法从marklogic的通用索引中检索索引词列表?

4

4 回答 4

1

通常你会在 MarkLogic 中使用这样的东西:

(
    for $v in cts:element-values(xs:Qname("myelem"))
    let $f := cts:frequency($v)
    order by $f descending
    return $v
)[1 to 10]

这种功能是内置在search:search库中的,使用起来非常方便。

但不幸的是,你不能在cts:wordsea 的值上使用它。有一个小技巧可以让你接近。cts:frequency您可以使用 a xdmp:estimateon acts:search来获取片段计数,而不是使用:

(
    for $v in cts:words()
    let $f := xdmp:estimate(cts:search(collection(), $v))
    order by $f descending
    return $v
)[1 to 10]

性能较差,但仍然比直截了当地运行所有文档要快得多。

于 2012-05-25T09:56:35.487 回答
1

如果您的搜索包含多个字词怎么办?你将如何计算订单?

如果您的某些术语在您的文档语料库中非常常见,而其他术语则非常罕见怎么办?“the”的计数应该比“protease”对分数的贡献更大,还是应该贡献相同?

如果这些词出现在标题中而不是文档中的其他地方,这有关系吗?

如果一个文件比较短,而另一个文件很长怎么办。你怎么解释?

这些是在尝试确定相关性时出现的一些基本问题。大多数搜索引擎使用词频(这些词在您的文档中出现的频率)和文档频率(有多少文档包含这些词)的组合。他们还可以使用文档中术语的位置来确定分数,并且他们还可以在确定分数时考虑文档长度。

默认情况下,MarkLogic 使用术语频率和文档频率的组合来确定相关性。这些因素(和其他因素)用于确定搜索条件的相关性分数,该分数是 search:search 从搜索 API 或低级 cts:search 及其支持运算符返回的结果的默认排序。

您可以查看 cts:search 选项的详细信息,以了解一些不同的评分选项。在此处查看“score-logtfidf”和其他内容:

http://community.marklogic.com/pubs/5.0/apidocs/SearchBuiltins.html#cts:search

我还会查看搜索开发人员指南:

http://community.marklogic.com/pubs/5.0/books/search-dev-guide.pdf

XQuery 工作组正在考虑将许多概念作为 XQuery 未来版本的增强功能。它们不是今天语言的一部分。MarkLogic 多年来一直处于搜索的前沿,因此您会发现产品中有许多功能,并且在档案中与该领域相关的讨论很多。

于 2012-05-25T12:57:57.553 回答
1

“有没有办法从marklogic的通用索引中检索索引词列表?” 不,通用索引是哈希索引,因此它包含哈希而不是单词。

正如其他人所指出的,您可以创建可以列出其内容的基于值的词典。其中一些还包括频率信息。但是,我有另一个建议:cts:distinctive-terms()从一系列节点中识别出最有特色的词条,这可能是搜索结果的当前页面。您可以控制输出术语是否只是单词,或者包含更复杂的术语,例如元素词或短语。有关更多详细信息,请参阅文档。

http://docs.marklogic.com/5.0doc/docapp.xqy#display.xqy?fname=http://pubs/5.0doc/apidoc/SearchBuiltins.xml&category=SearchBuiltins&function=cts:distinctive-terms

于 2012-05-25T16:05:07.323 回答
0

我使用了 cts:distinctive-terms()。在我的情况下,它主要提供通配符术语,这些术语没有多大用处。此外,它还适用于在单个文档中查找独特的术语。当我尝试在许多文档上运行它时,速度很慢。

我想要实现的是一个动态方面,其中填充了搜索结果中出现的文档的关键字。我已经实现了它,但它效率低下,因为它计算文档中所有单词的频率。我希望它是一个建议或推荐功能,例如,如果您搜索过这个特定的术语或短语,那么您可能会对这些建议的术语或短语感兴趣。所以我想要一种有效的方法来查找搜索文档结果集中常见的术语。

我按照建议尝试了 cts:words() 。它给出了与搜索查询词相似的词以及包含它的文档数。它没有考虑的是搜索结果文档集。它只显示整个数据库中包含相似词的文档的数量,无论这些文档是否存在于搜索结果中

于 2012-05-28T09:34:22.493 回答