我正在开发Marklogic工具 我有一个大约27000个文档的数据库。 我想要做的是检索由任何搜索查询的结果给出的文档中具有最大频率的关键字。 我目前正在使用xquery函数来计算作为查询结果检索的所有文档集中每个单词的频率。然而,这是非常低效的。 我想如果我能得到marklogic已经执行索引的单词列表,它会对我有所帮助。 那么有没有办法从marklogic的通用索引中检索索引词列表?
答案 0 :(得分: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:words
e.a的值上使用它。不幸。有一个小技巧可以让你接近。您可以在cts:frequency
上使用xdmp:estimate
来获取片段数,而不是使用cts:search
:
(
for $v in cts:words()
let $f := xdmp:estimate(cts:search(collection(), $v))
order by $f descending
return $v
)[1 to 10]
性能较低,但仍比直接运行所有文档快得多。
HTH!
答案 1 :(得分:1)
如果您的搜索包含多个字词,该怎么办?你将如何计算订单?
如果您的某些条款在您的文档库中非常常见,而其他条款非常罕见,该怎么办? “the”的数量是否应该比“蛋白酶”对分数的贡献更大,还是应该贡献相同的?
如果文字中出现的文字与文件中的其他地方有关,那是否重要?
如果一个文档相对较短,而另一个文档很长,该怎么办?你是如何解释的?
这些是尝试确定相关性时出现的一些基本问题。大多数搜索引擎使用术语频率(术语在文档中出现的频率)和文档频率(包含术语的文档数量)的组合。他们还可以使用文档中术语的位置来确定分数,并且还可以在确定分数时考虑文档长度。
MarkLogic使用术语频率和文档频率的组合来默认确定相关性。这些因素(和其他因素)用于确定搜索条件的相关性分数,此分数是搜索返回结果的默认排序:从搜索API或低级cts:search及其支持运算符搜索。
您可以查看cts选项的详细信息:搜索以了解一些不同的评分选项。请参阅“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多年来一直处于搜索的最前沿,因此您会发现产品中有许多功能,并且在档案中有很多与此区域相关的讨论。
答案 2 :(得分:1)
“有没有办法从marklogic的通用索引中检索索引词列表?”不。通用索引是哈希索引,所以它包含哈希而不是单词。
正如其他人所说,您可以创建可以列出其内容的基于价值的词典。其中一些还包括频率信息。但是,我还有另一个建议:cts:distinctive-terms()
将从一系列节点中识别出最独特的术语,这些节点可能是搜索结果的当前页面。您可以控制输出术语是否只是单词,还是包含更复杂的术语,如元素单词或短语。有关更多详细信息,请参阅文档。
答案 3 :(得分:0)
我使用过cts:distinct-terms()。在我的案例中,它主要给出了通配词,这些术语没什么用处。更为合适,它适用于在单个文档中查找不同的术语。当我尝试在许多文档上运行它时,它很慢。
我想要实现的是动态构面,其中填充了搜索结果中出现的文档的关键字。我已经实现了它,但效率很低,因为它计算了文档中所有单词的频率。我希望它是一个建议或推荐功能,如果您搜索了这个特定的术语或短语,那么您可能会对这些建议的术语或短语感兴趣。所以我想要一种有效的方法来查找搜索文档结果集中常见的术语。
我按照建议尝试了cts:words()。它提供与搜索查询词相似的单词以及包含它的文档数。它没有考虑的是搜索结果文档集。它只显示整个数据库中包含相似单词的文档数量,无论这些文档是否存在于搜索结果中