我使用
op:from-lexicons
访问计划进行以下光学查询:
op:from-lexicons((
map:map()
=> map:with("lexiconUuid", cts:element-reference(xs:QName("lexiconUuid")))
=> map:with("elementInDocumentToFilter", cts:element-reference(xs:QName("elementInDocumentToFilter")))
=> map:with("documentUuid", cts:element-reference(xs:QName("documentUuid")))
),"lexiconView")
=> op:where(op:eq(op:view-col("lexiconView","elementInDocumentToFilter"), "Filter Value"))
=> op:group-by(op:view-col("lexiconView","lexiconUuid"),
op:count("countOfDocsMeetingFilter", "documentUuid", map:entry('values', 'distinct'))
)
=> op:select((
op:view-col("lexiconView","lexiconUuid"),
op:as("hasCountOver0", op:gt(op:col("countOfDocsMeetingFilter"), 0))
))
当我将
op:result()
添加到此查询时,我得到如下输出:
lexiconView.lexiconUuid | 有CountOver0 |
---|---|
词典-uuid-1 | 真实 |
词典-uuid-2 | 假 |
此查询使用现有索引来返回
lexiconUuid
以及它是否出现在基于过滤器的任何文档中。当我尝试使用上面的查询作为 $rightPlan
的 op:join-inner
时,我没有得到任何结果(如,没有发生连接)。这是我使用上面的词典查询的查询:
op:from-view("schema", "table1")
(: table2 contains the lexiconUuid element I want to join the lexicon query with :)
=> op:join-inner(op:from-view("schema", "table2"),
op:on(
op:view-col("table1", "someUuid"),
op:view-col("table2", "someUuid")
)
)
=> op:join-inner(
(: op:from-lexicons() access plan here :),
op:on(
op:view-col("table2", "lexiconUuid"),
op:view-col("lexiconView", "lexiconUuid")
)
)
我知道一个事实是,
lexiconUuid
在加入table2
之后就存在,并存在于op:from-lexicons
查询中(即lexicon-uuid-1
存在于table2
中,所以它应该毫无问题地加入“lexiconView”)。我将此“lexiconView”复制为 TDE,连接按预期执行,但需要对现有数据进行聚合,因此我必须 op:group-by()
和 table1
中的所有列。我希望能够使用词典来避免另一个 TDE 并在更多列上执行分组/聚合。使用 table2
访问计划时我是否遗漏了什么?可以用在连接中吗?有人遇到过这个吗?op:from-lexicons
。我能够通过将排序规则添加到我的 TDE 列配置来解决该问题。
http://marklogic.com/collation/
添加一些 where 子句,将查询结果集缩小到我希望匹配的几个特定记录。
<column>
<name>uuid</name>
<scalar-type>string</scalar-type>
<val>uuid</val>
<collation>http://marklogic.com/collation/</collation>
</column>
进行复制