属性 在 Marklogic 中读取和分页的部分文档
Partial document read and pagination by property in Marklogic
我正在研究使用 Marklogic 的医疗系统。前段时间我问了一个问题 (),导致我们决定使用一个包含患者大部分信息的大型患者文档。出于示例的目的,我展示了一个简化的 Patient 文档,其中包含一个 Appointments.
数组
简化患者文档
{
"firstName": "Chauncey",
"lastName": "Hays",
"memberId": "KLKB XMQ 77",
"dateOfBirth": "1971-09-11",
"gender": "MALE",
"appointments": [
{
"name": "Follow Up",
"start": "2017-06-08T23:13:00Z",
"end": "2017-06-09T00:43:00Z"
},
{
"name": "Follow Up",
"start": "2017-06-09T23:13:00Z",
"end": "2017-06-10T00:43:00Z"
}
]
}
我们的一个用例是 return 按患者数据过滤的分页预约(属性 患者文档) 例如查找所有 MALE 患者的约会页面。我们已经为此苦苦挣扎了一段时间,但没有运气。我看到的解决方案之一(可能稍微过度设计)是 return 患者页面(患者页面可能导致比页面大小更多的约会)并在服务器端过滤掉约会。
我的主要问题是:在 Marklogic 中按患者数据(性别=男性)过滤、部分读取(读取约会)和按约会(患者文档的属性)对结果分页是否可行?
非常感谢任何评论。
你是对的,对于你的用例结构化查询选项“searchable-expression”将不起作用,因为你的查询过滤器在 searchable-expression 之外。不过,这是我尝试匹配 0 个结果的方法:
String query = "{ \"search\": {" +
"\"query\": {" +
" \"value-query\": {" +
" \"json-property\": \"gender\"," +
" \"text\": \"MALE\"" +
" }" +
"}," +
"\"options\": {" +
" \"searchable-expression\": {" +
" \"text\": \"appointments\"" +
" }" +
"}}}";
QueryManager queryMgr = client.newQueryManager();
RawCombinedQueryDefinition queryDef =
queryMgr.newRawCombinedQueryDefinitionAs(Format.JSON, query);
queryMgr.search(queryDef, new SearchHandle());
虽然 extract-document-data 有效,但正如您所描述的那样,您实际上是在翻阅文档,而不是提取的部分。不过,这是我尝试过的正确匹配并返回所需结果的方法,但没有提供按需要分页的方法:
String query = "{ \"search\": {" +
"\"query\": {" +
" \"value-query\": {" +
" \"json-property\": \"gender\"," +
" \"text\": [\"MALE\"]" +
" }" +
"}," +
"\"options\": {" +
" \"extract-document-data\": {" +
" \"extract-path\": \"/appointments\"" +
" }" +
"}}}";
QueryManager queryMgr = client.newQueryManager();
RawCombinedQueryDefinition queryDef =
queryMgr.newRawCombinedQueryDefinitionAs(Format.JSON, query);
DocumentManager docMgr = client.newDocumentManager();
DocumentPage page = docMgr.search(queryDef, 1);
所以我认为您需要求助于服务器端脚本,最好是 resource extension. Or you can do an invoke 的形式。在您的模块数据库中将此脚本作为“/ext/pageAppointments.xqy”安装:
declare variable $start as xs:long external;
declare variable $pageLength as xs:long external;
let $appointments :=
cts:search(collection(), cts:json-property-value-query("gender", "MALE"))/appointments
return $appointments[$start to ($start + $pageLength - 1)]
然后 运行 这个在 Java:
ServerEvaluationCall call = client.newServerEval()
.modulePath("/ext/pageAppointments.xqy")
.addVariable("start", 1)
.addVariable("pageLength", 10);
EvalResultIterator results = call.eval();
try {
for ( EvalResult result : results ) {
JsonNode appointment = result.getAs(JsonNode.class);
System.out.println(appointment);
}
} finally { results.close(); }
我正在研究使用 Marklogic 的医疗系统。前段时间我问了一个问题 (
简化患者文档
{
"firstName": "Chauncey",
"lastName": "Hays",
"memberId": "KLKB XMQ 77",
"dateOfBirth": "1971-09-11",
"gender": "MALE",
"appointments": [
{
"name": "Follow Up",
"start": "2017-06-08T23:13:00Z",
"end": "2017-06-09T00:43:00Z"
},
{
"name": "Follow Up",
"start": "2017-06-09T23:13:00Z",
"end": "2017-06-10T00:43:00Z"
}
]
}
我们的一个用例是 return 按患者数据过滤的分页预约(属性 患者文档) 例如查找所有 MALE 患者的约会页面。我们已经为此苦苦挣扎了一段时间,但没有运气。我看到的解决方案之一(可能稍微过度设计)是 return 患者页面(患者页面可能导致比页面大小更多的约会)并在服务器端过滤掉约会。
我的主要问题是:在 Marklogic 中按患者数据(性别=男性)过滤、部分读取(读取约会)和按约会(患者文档的属性)对结果分页是否可行? 非常感谢任何评论。
你是对的,对于你的用例结构化查询选项“searchable-expression”将不起作用,因为你的查询过滤器在 searchable-expression 之外。不过,这是我尝试匹配 0 个结果的方法:
String query = "{ \"search\": {" +
"\"query\": {" +
" \"value-query\": {" +
" \"json-property\": \"gender\"," +
" \"text\": \"MALE\"" +
" }" +
"}," +
"\"options\": {" +
" \"searchable-expression\": {" +
" \"text\": \"appointments\"" +
" }" +
"}}}";
QueryManager queryMgr = client.newQueryManager();
RawCombinedQueryDefinition queryDef =
queryMgr.newRawCombinedQueryDefinitionAs(Format.JSON, query);
queryMgr.search(queryDef, new SearchHandle());
虽然 extract-document-data 有效,但正如您所描述的那样,您实际上是在翻阅文档,而不是提取的部分。不过,这是我尝试过的正确匹配并返回所需结果的方法,但没有提供按需要分页的方法:
String query = "{ \"search\": {" +
"\"query\": {" +
" \"value-query\": {" +
" \"json-property\": \"gender\"," +
" \"text\": [\"MALE\"]" +
" }" +
"}," +
"\"options\": {" +
" \"extract-document-data\": {" +
" \"extract-path\": \"/appointments\"" +
" }" +
"}}}";
QueryManager queryMgr = client.newQueryManager();
RawCombinedQueryDefinition queryDef =
queryMgr.newRawCombinedQueryDefinitionAs(Format.JSON, query);
DocumentManager docMgr = client.newDocumentManager();
DocumentPage page = docMgr.search(queryDef, 1);
所以我认为您需要求助于服务器端脚本,最好是 resource extension. Or you can do an invoke 的形式。在您的模块数据库中将此脚本作为“/ext/pageAppointments.xqy”安装:
declare variable $start as xs:long external;
declare variable $pageLength as xs:long external;
let $appointments :=
cts:search(collection(), cts:json-property-value-query("gender", "MALE"))/appointments
return $appointments[$start to ($start + $pageLength - 1)]
然后 运行 这个在 Java:
ServerEvaluationCall call = client.newServerEval()
.modulePath("/ext/pageAppointments.xqy")
.addVariable("start", 1)
.addVariable("pageLength", 10);
EvalResultIterator results = call.eval();
try {
for ( EvalResult result : results ) {
JsonNode appointment = result.getAs(JsonNode.class);
System.out.println(appointment);
}
} finally { results.close(); }