我想在MarkLogic中搜索文档。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"), "*"))))))))))
问题是上面的查询将返回示例文档。 子查询(而非)用于检查最大/最小值是否存在。在某些情况下,可能只有最小值或只有最大值。
但是这个文件出界了!
我的数据库确实有最小值和最大值的元素范围索引。所有其他设置都是默认设置。
什么问题?有什么建议么。
UPDATE
好了,感谢您的建议,但没有。启用价值位置并不能解决问题。然而一个解决方法是删除了“和不查询”,并以“和查询”更换和新的属性添加到文件:
<chemicalProperty hasMin="0" hasMax="1">...
索引和查询这些属性的工作并返回正确的结果。
如果您有后续问题,请将其作为单独的SO问题发布。如果这个问题是相关的,那么你可以链接到新的问题。 – wst