【发布时间】:2016-09-21 13:32:49
【问题描述】:
我想在 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"), "*"))))))))))
问题是上面的查询将返回示例文档。 子查询(和 - 不)在那里检查是否存在最大/最小值。在某些情况下,可能只有最小值或最大值。
但是这个文档超出了范围?!
我的数据库确实在最小值和最大值上有元素范围索引。所有其他设置均为默认设置。
有什么问题?任何建议。
更新
好的,感谢您的建议,但没有。启用值位置并不能解决问题。然而,一种解决方法是删除“and-not-query”并将其替换为“and-query”并向文档添加新属性:
<chemicalProperty hasMin="0" hasMax="1">...
索引和查询这些属性有效并返回正确的结果。
【问题讨论】:
-
如果您有后续问题,请将其作为单独的 SO 问题发布。如果这个问题是相关的,那么您可以在新问题中链接到它。
标签: xquery marklogic marklogic-8