我们尝试在Marklogic上去实现一个搜索逻辑。逻辑中包含了cts:element-query 和 cts:not-query (即例子中变量$isPulledBack)。但用这个逻辑搜索出来的结果跟我们的预期有很大的出入。在下面的例子当中,我们的条件是搜索出文不同时包含vendorId="ABC"且IsPulledBack=“Y”的File元素的文档。给出的测试数据12345.xml完全符合这个条件,却没有被返回。再调用cts:contains去检查12345.xml是否符合$isPulledBack这个query的时候,返回了true。同样的query,cts:contains返回true,cts:search却没有返回结果。这个本身就是矛盾的。然后尝试将cts:not-query去掉,之用cts:element-query,同时调整测试数据。然后用这样的query去search,每次的返回都很正常,而且cts:search与cts:contains的结果也都符合,不再矛盾。综上,我们就怀疑cts:element-query 和 cts:not-query同时使用时可能存在某种bug。我们用的Marklogic版本是“6.0-4.1”。已经将这个问题report给了Marklogic的support,建了相应的ticket,希望官方能给出解释并解决这个问题。
(:
To reproduce this issue:
#1 Data preparation: please create test data in DB
:)
xdmp:document-insert("/test/12345.xml",
<Sample id="12345" xml:lang="en">
<Files>
<File fileType="PDF" vendorId="ABC">
<FileName>mde792355.pdf</FileName>
<RixmlResourceId/>
<ExpireDateTime>2029-04-28T15:47:52.000Z</ExpireDateTime>
<ExpireDimensionDate>210710</ExpireDimensionDate>
<ExpireDimensionTime>142472</ExpireDimensionTime>
<IsPulledBack>N</IsPulledBack>
<IsTransmitted>Y</IsTransmitted>
<DistTime>2014-05-02T11:49:59.000Z</DistTime>
<DefaultRendition>Y</DefaultRendition>
</File>
<File fileType="PDF" vendorId="EFG">
<FileName>mde792355.pdf</FileName>
<RixmlResourceId/>
<ExpireDateTime>2029-04-28T15:47:52.000Z</ExpireDateTime>
<ExpireDimensionDate>210710</ExpireDimensionDate>
<ExpireDimensionTime>142472</ExpireDimensionTime>
<IsPulledBack>N</IsPulledBack>
<IsTransmitted>Y</IsTransmitted>
<DistTime>2029-04-28T15:47:52.000Z</DistTime>
<DefaultRendition>Y</DefaultRendition>
</File>
<File fileType="R-PDF" vendorId="HIJ">
<FileName>QO3I.pdf</FileName>
<RixmlResourceId/>
<ExpireDateTime>2029-04-28T15:47:52.000Z</ExpireDateTime>
<ExpireDimensionDate>210710</ExpireDimensionDate>
<ExpireDimensionTime>142472</ExpireDimensionTime>
<IsPulledBack>N</IsPulledBack>
<IsTransmitted>Y</IsTransmitted>
<DistTime>2029-04-28T15:47:52.000Z</DistTime>
<DefaultRendition>Y</DefaultRendition>
</File>
<File fileType="PDF" vendorId="LMN">
<FileName>QO3H.pdf</FileName>
<RixmlResourceId/>
<ExpireDateTime>2029-04-28T15:47:52.000Z</ExpireDateTime>
<ExpireDimensionDate>210710</ExpireDimensionDate>
<ExpireDimensionTime>142472</ExpireDimensionTime>
<IsPulledBack>N</IsPulledBack>
<IsTransmitted>Y</IsTransmitted>
<DistTime>2029-04-28T15:47:52.000Z</DistTime>
<DefaultRendition>Y</DefaultRendition>
</File>
</Files>
</Sample>
)
(:
#2 run the below code against the test data:
:)
let $isPulledBack := cts:not-query(
cts:element-query(xs:QName("Files"),
cts:element-query(xs:QName("File"),
cts:and-query( (
cts:element-attribute-value-query(xs:QName("File"), xs:QName("vendorId"), "ABC"),
cts:element-value-query(xs:QName("IsPulledBack"), "Y")
) )
)
)
)
return cts:search(/Sample, $isPulledBack) (:It returns no results, but we don’t have vendorId equals to “ABC” and IsPulledBack equals “Y”:)