Xquery 如何为不同元素中的数据获取facet中的单行数据
我们在MarkLogic中有如下数据Xquery 如何为不同元素中的数据获取facet中的单行数据,xquery,marklogic,facet,Xquery,Marklogic,Facet,我们在MarkLogic中有如下数据 <article> <data id=1> <author> <name> <fname>manish</fname> <sname>joisar</sname> </name> </author> </data> <da
<article>
<data id=1>
<author>
<name>
<fname>manish</fname>
<sname>joisar</sname>
</name>
</author>
</data>
<data id=2>
<author>
<name>
<fname>Rakesh</fname>
<sname>Malhotra</sname>
</name>
</author>
<editor>
<name>
<fname>manish</fname>
<sname>joisar</sname>
</name>
</editor>
</data>
<data id=3>
<author>
<name>
<fname>manish</fname>
<sname>joisar</sname>
</name>
</author>
<editor>
<name>
<fname>manish</fname>
<sname>joisar</sname>
</name>
</editor>
</data>
</article>
<constraint name="AuFacet">
<range collation="http://marklogic.com/collation/" type="xs:string" facet="{$IsFacet}">
<element ns="" name="name"/>
<facet-option>descending</facet-option>
<facet-option>frequency-order</facet-option>
<facet-option>limit=10</facet-option>
</range>
</constraint>
{
"name": "authors",
"type": "xs:string",
"Values": [
{
"value": "manish joisar",
"count": "2"
},
{
"value": "manish joisar",
"count": "2"
},
{
"value": "Rakesh Malhotra",
"count": "1"
},
]
}
{
"name": "authors",
"type": "xs:string",
"Values": [
{
"value": "manish joisar",
"count": "3"
}
{
"value": "Rakesh Mahotra",
"count": "1"
},
]
}
我希望实现如下数据
<article>
<data id=1>
<author>
<name>
<fname>manish</fname>
<sname>joisar</sname>
</name>
</author>
</data>
<data id=2>
<author>
<name>
<fname>Rakesh</fname>
<sname>Malhotra</sname>
</name>
</author>
<editor>
<name>
<fname>manish</fname>
<sname>joisar</sname>
</name>
</editor>
</data>
<data id=3>
<author>
<name>
<fname>manish</fname>
<sname>joisar</sname>
</name>
</author>
<editor>
<name>
<fname>manish</fname>
<sname>joisar</sname>
</name>
</editor>
</data>
</article>
<constraint name="AuFacet">
<range collation="http://marklogic.com/collation/" type="xs:string" facet="{$IsFacet}">
<element ns="" name="name"/>
<facet-option>descending</facet-option>
<facet-option>frequency-order</facet-option>
<facet-option>limit=10</facet-option>
</range>
</constraint>
{
"name": "authors",
"type": "xs:string",
"Values": [
{
"value": "manish joisar",
"count": "2"
},
{
"value": "manish joisar",
"count": "2"
},
{
"value": "Rakesh Malhotra",
"count": "1"
},
]
}
{
"name": "authors",
"type": "xs:string",
"Values": [
{
"value": "manish joisar",
"count": "3"
}
{
"value": "Rakesh Mahotra",
"count": "1"
},
]
}
我不想做后期处理。因为我只寻找元素名,所以我应该得到在author/editor之间匹配author的组合计数。
到目前为止,当在两个文档中都找到名称时,它将计算一个文档&将其添加到author count中,但当person是编辑器时,它将创建具有相同名称的单独列表
编辑:我已更改了数据结构,我们发现问题仅存在于父元素包含子元素且在父元素上实现了方面的情况下。将范围索引放置在具有子结构的元素上会根据元素的整个内容创建值,如下所述: 输出具有重复项的事实表明索引值在某种程度上是不一致的——可能是在搜索API报告中规范化的空白字符中,而不是在索引中 在报告之前查看值的一种方法是使用QueryConsole中的等效查询调用
cts.countAggregate()
:
如果存在空格或其他不一致的问题,一种可能的解决方案是以一致的方式将名称连接为属性中的单个原子值,并在该属性上放置范围索引
另一种解决方案可能是不包括根的字段范围索引:
另一种方法是创建一个TDE,该TDE为fname和sname构造单独的列(或具有规范化并连接的fname和sname的单个列),并在列或列上使用计数聚合进行分组
对原员额的答复 通过添加以下内容,将查询选项配置为计算项目(aka值)频率而不是片段(aka文档)频率是否有效:
<facet-option>item-frequency</facet-option>
项目频率
有关详细信息,请参见
希望这会有所帮助,这不起作用,不确定MarkLogic是否有任何选项来解决这个问题,现在我们正在寻找使用xslt进行后处理。如果有人能从MarkLogic本身获得分辨率,那就太棒了。我们确实有回归测试,可以将item frequency facet选项应用于范围索引。如果这个选项在你的情况下不起作用,请考虑用MARKLogic支持来提交一个案例。谢谢你的回复,所以你的意思是说,使用项目频率选项,它应该工作吗?我应该给我在原始问题中提到的结果吗?父元素是否不同并不重要?我已经修改了问题,因为只有当facet元素包含子元素时才有问题正如答案中所指出的,一种策略是在编写过程中转换文档,以便name元素具有一个具有规范化和连接的fname和sname的属性。然后,可以在属性上添加范围索引。另一种选择是使用TDE索引而不是范围索引。我会在答案后面加上这个选项。