The function signature for cts.andQuery accepts an array. You are using ()
instead of [] around your sub-queries. This should work:
fn.count(
cts.search(
cts.jsonPropertyScopeQuery("stages",
cts.andQuery([
cts.jsonPropertyValueQuery("status", "CURRENT"),
cts.jsonPropertyValueQuery("stageId", 9999)
])
)
, 'filtered')
);
From: <[email protected]> on behalf of APEL Holger
<[email protected]>
Reply-To: MarkLogic Developer Discussion <[email protected]>
Date: Friday, August 18, 2017 at 5:05 AM
To: MarkLogic Developer Discussion <[email protected]>
Subject: [MarkLogic Dev General] Search result estimation: issue with json
array structure
Hello community,
I stumbled over a use case where the total result count of a query is wrong.
Here or set of test data
declareUpdate();
for (i = 0; i < 10; i++) {
xdmp.documentInsert(
"/a" + i + ".json",
{
"project": {
"stages": [{"stageId": 9999, "status": "CURRENT"},
{"stageId": 9999, "status": "CLOSED"}]
}
}
);
xdmp.documentInsert(
"/b" + i + ".json",
{
"project": {
"stages": [{"stageId": 9998, "status": "CURRENT"},
{"stageId": 9999, "status": "CLOSED"}]
}
}
);
};
fn.count(
cts.search(
cts.jsonPropertyScopeQuery("stages",
cts.andQuery(
(cts.jsonPropertyValueQuery("status", "CURRENT"),
cts.jsonPropertyValueQuery("stageId", 9999))
)
)
, 'filtered')
);
Returns 20 but in xquery
fn:count(
cts:search(/,
cts:json-property-scope-query("stages",
cts:and-query(
(cts:json-property-value-query("status", "CURRENT"),
cts:json-property-value-query("stageId", 9999))
)
)
)
)
correctly returns 10
I guess cts.search uses the search:* module behind the scenes because
search:resolve gives me the same result doing an equivalent query. So it seems
the problem is result estimation … I know search:resolve uses xdmp:estimate and
xdmp:remainder and replacing fn:count with xdmp:estimate
xdmp:estimate(
cts:search(/,
cts:json-property-scope-query("stages",
cts:and-query(
(cts:json-property-value-query("status", "CURRENT"),
cts:json-property-value-query("stageId", 9999))
)
)
)
)
also gives me the 20.
In our use case the data set is rather small so the wrong estimates are very
noticeable and not acceptable.
So my questions: is there a way to get the right count?
· By tuning some indexes
· Using additional query-options
· Changing our query or even data model if there is no other way
Any hint is welcome
holger apel
software manager | information technology and electronic services | iso central
secretariat<http://www.iso.org/iso/contact_iso>
_______________________________________________
General mailing list
[email protected]
Manage your subscription at:
http://developer.marklogic.com/mailman/listinfo/general