2

我正在使用带有新 api search:search 的构面进行搜索,但我遇到了下一个问题:

我的来源:文件#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选项。

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

美国 - 2(在美国至少有一个位置的文件数量)西班牙 - 1

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

美国 - 3 西班牙 - 1

结果应该是这样的:

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

我怎样才能做到这一点???

4

2 回答 2

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

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

于 2012-04-16T18:48:52.160 回答
0

尝试 cts:element-value-co-occurrences with name 和 country

于 2012-04-16T22:49:43.330 回答