【问题标题】:Search with Multiple key Value Pairs in MarkLogic database with java使用 java 在 MarkLogic 数据库中搜索多个键值对
【发布时间】:2018-11-15 02:55:14
【问题描述】:

我想在 MarkLogic 数据库中搜索包含给定元素值对的 XML 文档,并且我想改变元素值对的大小。

这是我编写的查询,用于查找帐户为“00100”且描述为“hello”的匹配文档。

    QueryManager queryMgr = client.newQueryManager();
    StructuredQueryBuilder qryBldr = new StructuredQueryBuilder();
    StructuredQueryDefinition query1 = 
    qryBldr.value(qryBldr.element("ACCOUNT"), "00100");
    StructuredQueryDefinition query2 = 
    qryBldr.value(qryBldr.element("DESCRIPTION"), "hello");
    StructuredQueryDefinition query = qryBldr.and(query1,query2);
    SearchHandle resultsHandle = new SearchHandle();
    queryMgr.search(query, resultsHandle);

我想写一个方法,它将接受包含键值对的输入映射,它将基于映射键值对形成查询并返回匹配的文档。

示例文档如下所示:

  <Tax>
      <ACCOUNT>00100</ACCOUNT>
      <DESCRIPTION>hello</DESCRIPTION>
      <AMOUNT>100</AMOUNT>
      <DATE>05252018</DATE>
  </Tax>

我该如何实现?

【问题讨论】:

  • 感谢@Mads Hansen 的编辑

标签: java xquery marklogic


【解决方案1】:
We can use the Query By Example(QBE) method to solve this issue.
Ex: document structure 

       <Account>
         <Name>ram</Name>
         <AccountNumber>999</AccountNumber>
         <Amount>100<Amount>
       </Account>

We can use qbe write as below 

String XMLQuery =
  "<q:qbe xmlns:q='http://marklogic.com/appservices/querybyexample'>"+
  "<q:query>" +
  "<Name>ram</Name>" +
  "</q:query>" +
  "</q:qbe>";
StringHandle newHandle=new StringHandle(XMLQuery).withFormat(Format.XML);
RawQueryByExampleDefinition querydef =
    queryMgr.newRawQueryByExampleDefinition(newHandle);
SearchHandle resultsHandle = 
    queryMgr.search(querydef, new SearchHandle());

For forming the XMLQuery from Map we can use below code:

    public String getMarklogicQuery(Map<String,String> map){
        StringBuffer query = new StringBuffer();
        query.append("<q:qbe xmlns:q='http://marklogic.com/appservices/querybyexample'>");
        query.append("<q:query>");
        for(String key:map.keySet()){
            query.append("<"+key+">"+map.get(key)+"</"+key+">");
        }
        query.append("</q:query>");
        query.append("</q:qbe>");

    return query.toString();
    }

参考:https://docs.marklogic.com/guide/java/searches#id_33275

【讨论】:

    【解决方案2】:

    Java 8 应该能够使用类似于以下代码的流转换地图(未经测试):

    StructuredQueryDefinition query = qryBldr.and(
        theInputMap
        .entrySet()
        .stream()
        .map(entry -> qryBlder.value(
            qryBldr.element(entry.getKey()), entry.getValue()
            ))
        .toArray(size -> new StructuredQueryDefinition[size])
        );
    

    如果查询总是由键值对组成,您还可以考虑通过示例查询:

    http://docs.marklogic.com/guide/search-dev/qbe

    在这种方法中,您只需将映射序列化为 JSON——例如,使用 Jackson。

    希望对您有所帮助,

    【讨论】:

    • 感谢您的建议,我通过将地图转换为 XML 及其工作来尝试 QBE。
    猜你喜欢
    • 2018-10-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 2012-06-05
    • 2017-09-08
    • 2015-11-05
    • 1970-01-01
    • 2015-06-13
    相关资源
    最近更新 更多