使用运算符对MarkLogic文档进行高级过滤

时间:2018-05-08 11:24:26

标签: marklogic marklogic-8 marklogic-9

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

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

例如:emp_name = John && age > 40 || <available> != false

这里有两个部分:

  1. 运营商“||”和“&amp;&amp;”用于逻辑分组
  2. 运营商&gt;,&lt;,=和!=进行比较
  3. 目前我们使用以下代码生成查询并执行它。 [以编程方式插入“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;和!=在值查询中。

1 个答案:

答案 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();