我想在MarkLogic中搜索文档。
我的文件如下:
<product xmlns="myns/products">
<id>3114</id>
<materialNo xml:lang="en">1.1160</materialNo>
<steelName xml:lang="en">SWRCH24K</steelName>
<name xml:lang="en">wire, wire rod for cold heading</name>
<chemicalProperties>
<chemicalProperty>
<element>c</element>
<min>0.1900</min>
<max>0.2500</max>
</chemicalProperty>
<chemicalProperty>
<element>si</element>
<min>0.1000</min>
<max>0.3500</max>
</chemicalProperty>
<chemicalProperty>
<element>mn</element>
<min>1.3500</min>
<max>1.6500</max>
</chemicalProperty>
<chemicalProperty>
<element>p</element>
<max>0.0300</max>
</chemicalProperty>
</chemicalProperties>
</product>
所以我想通过化学特性的最大/最小值进行搜索。为此,我使用此xquery搜索(简单示例):
cts:search(/, cts:and-query(
(cts:collection-query("test"),
cts:element-value-query(
fn:QName("myns/products", "name"),
"wire, wire rod for cold heading"),
cts:element-query(
fn:QName("myns/products", "chemicalProperty"),
cts:and-query(
(cts:element-value-query(
fn:QName("myns/products", "element"), "c"),
cts:or-query(
(cts:element-range-query(
fn:QName("myns/products", "max"), "<=", 0.2),
cts:and-not-query(
cts:element-range-query(
fn:QName("myns/products", "min"), "<=", 0.2),
cts:element-value-query(
fn:QName("myns/products", "max"), "*")))),
cts:or-query(
(cts:element-range-query(
fn:QName("myns/products", "min"), ">=", 0.1),
cts:and-not-query(
cts:element-range-query(
fn:QName("myns/products", "max"), ">=", 0.1),
cts:element-value-query(
fn:QName("myns/products", "min"), "*"))))))))))
问题是上面的查询将返回示例文档。 子查询(和 - 不是)用于检查是否存在max / min。在某些情况下,可能只有最小值或仅有最大值。
但是这个文件超出范围?!
我的数据库确实有最小和最大的元素范围索引。所有其他设置均为默认值。
有什么问题?任何建议。
更新
好的,谢谢你的建议,但没有。启用值位置无法解决问题。但是,解决方法是删除“and-not-query”并将其替换为“and-query”并向文档添加新属性:
<chemicalProperty hasMin="0" hasMax="1">...
索引和查询这些属性,并返回正确的结果。
答案 0 :(得分:1)
由于您的索引设置,如果cts:element-query
和min
查询在任意 {{1}中匹配,则max
可能会返回true在同一文档中,不限于单个<chemicalProperty>
。不过,我只希望在未经过滤的搜索中看到这一点,而且在致电<chemicalProperty>
时我也看不到这个选项。
首先尝试启用cts:search
,这应允许数据库使用索引从不同元素中排除匹配。
另一种解决方案是使用element value positions
按位置约束元素查询中的值。
答案 1 :(得分:0)
问题似乎是你试图在cts:element-value-query
调用中使用通配符,但不会声明它们是通配符。由于没有任何内容与文字“*”匹配,cts:and-not-query
与您的意图相反。
你想要这样的东西:
cts:element-value-query(
fn:QName("myns/products", "max"), "*", "wildcarded")
或者,您可以启用其中一个通配符索引,ML将自动检测通配符查询。
如果既没有“wildcarded”也没有“unwildcarded”,则数据库配置和$ text确定通配符。如果数据库启用了任何通配符索引(“三个字符搜索”,“一个字符搜索”,“一个字符搜索”或“尾随通配符搜索”),并且$ text包含任何一个通配符'?'或'*',它指定“通配符”。否则它指定“unwildcarded”。