1

我们正在开发一个使用 ML 作为文档存储的企业应用程序。大量与业务相关的 XML 文档存储在 ML 中。

为了实现业务逻辑,我们需要有代码,通过对它们应用过滤器来检索 XML。喜欢: element_tag_1 = value1 && element_tag_2 > value2 || element_tag_3 = value2

前任:emp_name = John && age > 40 || <available> != false

这里有两个部分:

  1. 运算符“||” 和“&&”用于逻辑分组
  2. 运算符 >、<、= 和 != 用于比较

目前我们正在使用下面的代码来生成查询并执行它。[“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 && age > 40

问题2:目前我们只对默认情况下发生的比较进行=。我们如何在此处引入运算符来检查值查询中的 > 、 < 和 != 。

4

1 回答 1

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();
于 2018-05-10T11:45:08.990 回答