不要在MarkLogic的方面包含重复数据

时间:2012-04-16 15:17:54

标签: xquery marklogic

我正在使用带有新api搜索的facet进行搜索:搜索但我有下一个问题:

我的来源: 文件#1

<root>
<location>
<university>
<name>Yale</name>
<country>USA</country>
</university>
</location>
<location>
<university>
<name>MIT</name>
<country>USA</country>
</university>
</location>
<location>
<university>
<name>Santander</name>
<country>Spain</country>
</university>
</location>
</root>

档案#2

<root>
<location>
<university>
<name>MIT</name>
<country>USA</country>
</university>
</location>
</root>

我需要知道每个国家/地区的大学数量,但是方面会返回包含一个国家/地区的文件数量或所有文件重复大学的位置数量,因此在最后一个数据示例中它返回给我有两个选项。

第一个选项(使用频率顺序)

美国 - 2(与美国至少有一个位置的档案数量) 西班牙 - 1

第二个选项(使用项目频率)

美国 - 3 西班牙 - 1

结果应为:

美国 - 2(因为在两个档案中只有两所大学) 西班牙 - 1

我该怎么办?

2 个答案:

答案 0 :(得分:2)

我认为你需要item-frequency选项,而不是默认的fragment-frequency选项。您将其作为所谓的facet-option添加到约束中。可以在CMC上找到更多详细信息和示例:http://community.marklogic.com/pubs/5.0/apidocs/SearchAPI.html#search:search

- 编辑 -

我认为我没有彻底阅读你的问题。搜索库专注于搜索结果,并且方面依赖于片段。提高计数的最简单方法是将location元素定义为片段根。但是,我不认为这真的会返回您正在寻找的数字。国家方面实际上只计算国家的发生次数,而不是国家内的大学。你无法用搜索库实现这一目标。不过要做到这一点并不难:

for $country in cts:element-values(xs:QName('country'))
let $universities := cts:element-values(xs:QName('university'), (), cts:element-value-query(xs:QName('country'), $country))
return fn:concat($country, ' - ', fn:count($universities))

注意:未经测试的代码,但它至少显示了必要的步骤。它还要求各国不要出现在同一片段内。您需要在ML管理界面中添加location作为片段根目录。

HTH!

答案 1 :(得分:0)

尝试使用名称和国家/地区的cts:element-value-co-occurrence