我们正在使用ML作为文档存储来开发企业应用程序。与业务相关的大量XML文档存储在ML中。
要实现业务逻辑,我们需要通过对它们应用过滤器来获取检索XML的代码。喜欢:element_tag_1 = value1 && element_tag_2 > value2 || element_tag_3 = value2
例如:emp_name = John && age > 40 || <available> != false
这里有两个部分:
目前我们使用以下代码生成查询并执行它。 [以编程方式插入“emp_name”和搜索文本“John”。未在下面的代码段中显示]
StringBuilder sb = new StringBuilder();
sb.append("<search:search xmlns:search=\"http://marklogic.com/appservices/search\">");
sb.append(" <search:query>");
sb.append(" <search:value-query>");
sb.append(" <search:element name=\"emp_name\"/>");
sb.append(" <search:text>John</search:text>");
sb.append(" </search:value-query>");
sb.append(" </search:query>");
sb.append(" <search:options>");
sb.append(" <search:sort-order type=\"xs:string\" collation=\"http://marklogic.com/collation/\" direction=\"descending\">");
sb.append(" <search:element name=\"filterName\"/>");
sb.append(" </search:sort-order>");
sb.append(" </search:options>");
sb.append("</search:search>");
QueryManager queryMgr = client.newQueryManager();
SearchHandle resultsHandle = new SearchHandle();
RawQueryDefinition query = queryMgr.newRawCombinedQueryDefinition(new StringHandle(sb.toString()));
query.setCollections(BaseDataConstants.FILTER_COLLECTIONS);
queryMgr.search(query, resultsHandle);
上述方法是否正确?
问题1:使用上面的代码,我们只查询文档上的emp_name = John。 我们如何通过它们之间的逻辑分组进行多重值查询,例如:emp_name = John&amp;&amp;年龄> 40
问题2:目前我们只做=比较默认情况下发生的事情。 我们如何在此处介绍运营商以检查&gt; ,&lt;和!=在值查询中。
答案 0 :(得分:3)
我想我会在这里使用StructuredQueryBuilder:
QueryManager queryMgr = client.newQueryManager();
StructuredQueryBuilder qb = new StructuredQueryBuilder(OPTIONS_NAME);
StructuredQueryDefinition querydef =
qb.and(
qb.value("emp_name", "John"),
qb.range("age", "xs:int", StructuredQueryBuilder.Operator.GT, 40)
);
StringHandle searchHandle =
queryMgr.search(queryDef, new StringHandle()).get();