我想在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