使用MarkLogic Java API,搜索和检索格式化的XML匹配属性,集合和内容

时间:2015-06-15 16:26:29

标签: marklogic

我的文档的属性为userId:sricollection为“sony”,以及 文档内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<songs>
   <song>
     <title>Against the Wind</title>
     <artist>Bob Seger</artist>
   <song>
   <song>
     <title>one love</title>
     <artist>Bob Marley</artist>
   <song>
   <song>
     <title>Beat it</title>
     <artist>Micheal Jackson</artist>
   <song>   
<songs>

我希望按artist编写查询,其属性userId等于“XYZ”,集合名称等于“abc”,artist等于“per”。最终结果应如下所示:

<song>
  <title>MNO</title>
</song>

1 个答案:

答案 0 :(得分:2)

您可以将数据建模为将每首歌曲存储为单独的文档吗?在MarkLogic中进行建模的一个最佳实践是使用文档作为关系数据库中行的等效项,并使用集合作为表的等效项。

您可以将userId存储在文档中吗?在MarkLogic中进行建模的另一个最佳实践是使用包络模式(与HTML头部和主体一样),因此元数据和数据都在同一文档中。这样,查询可以获取元数据和数据,只读取一个片段(更快)。

如果对模型进行建议的更改,则使用Java API中的StructuredQueryBuilder的查询将类似于以下代码:

QueryManager queryMgr = client.newQueryManager();
StructuredQueryBuilder qb = new StructuredQueryBuilder();
StructuredQueryDefinition querydef = qb.and(
    qb.collection("abc"),
    qb.value(element("userId"), "xyz"),
    qb.value(element("artist"), "pqr")
    );
SearchHandle resultsHandle = queryMgr.search(querydef, new SearchHandle());

有关迭代结果的信息,请参阅以下示例:

https://github.com/marklogic/java-client-api/blob/master/src/main/java/com/marklogic/client/example/cookbook/StructuredSearch.java#L126

有关匹配集合的更多详细信息:

http://docs.marklogic.com/javadoc/client/com/marklogic/client/query/StructuredQueryBuilder.html#collection%28java.lang.String...%29

有关匹配值的更多详细信息:

http://docs.marklogic.com/javadoc/client/com/marklogic/client/query/StructuredQueryBuilder.html#value%28com.marklogic.client.query.StructuredQueryBuilder.TextIndex,%20java.lang.String...%29

如果必须匹配属性中的元数据,可以使用properties()构建器函数,但这不是最佳实践:

http://docs.marklogic.com/javadoc/client/com/marklogic/client/query/StructuredQueryBuilder.html#properties%28com.marklogic.client.query.StructuredQueryDefinition%29

希望有帮助,