【问题标题】:Document XPath searching with Marklogic's Java search API vs XQuery/XSLT API使用 Marklogic 的 Java 搜索 API 与 XQuery/XSLT API 进行文档 XPath 搜索
【发布时间】:2013-08-28 19:19:28
【问题描述】:

我有以下 Marklogic 查询,当在查询控制台中运行时,我可以检索具有管理员权限的系统用户:

xquery version "1.0-ml";
import schema namespace bfa="http://bitfood.org/auth" at "schema/auth/bitfood-auth.xsd";
cts:search(/bfa:AppUser[bfa:appAccess/@appRole = "ROLE_SYS_ADMIN"], cts:and-query(()))

请原谅我的无知,但是否可以仅使用 Java 客户端 API 来实现此查询?

我知道我可以通过 XCC 使用原始查询,但我试图尽可能避免这种情况。

我一直在研究 Java 客户端 API 的文档,不幸的是,该文档简要介绍了其他搜索方法,但没有发现任何暗示这是可能的。

更新 1: 伙计们,我想我在这里大获全胜。

根据this question,Java 客户端 API 的查询选项构建工具被标记为已弃用。

@ehennum 建议使用 XML 或 JSON 查询选项的替代方案。但是,这样的查询选项规范是still essentially defined as raw Strings in the code:

String xmlOptions =
  "<search:options "+
        "xmlns:search='http://marklogic.com/appservices/search'>"+
      "<search:constraint name='industry'>"+
        "<search:value>"+
          "<search:element name='industry' ns=''/>"+
        "</search:value>"+
      "</search:constraint>"+
  "</search:options>";

当然,我可以使用 JAXB、JDOM、文件或其他一些工具来创建 XML,但我个人的看法是,我们仍在诉诸 storing queries in resource files in the code,这本身并不是一件坏事,但没有仔细考虑可能导致代码维护噩梦。

此外,这些选项需要在服务器上通过 REST 持久化这一事实引入了一层潜在的问题,以防这是强制性的,因为这些选项可能需要与每个旨在使用代码库。

因此,如果 Marklogic 开发人员正在倾听,我认为 Java 客户端 API 并不像我预期的那样成熟或记录在案。

目前我有两种选择:

1) 我可以在字符串文件中硬编码我的 XCC 查询,并尝试使用参数占位符插入我需要的数据并通过 XCC 会话检索。或者。

2) 查看http://marklogic.com/appservices/search 命名空间是否有任何 XSD 文件并从中创建静态 JAXB 对象,以便构建某种“标准”类 a la Hibernate 或 QueryDSL,遗憾的是,我必须说,已经支持某种级别的 MongoDB 查询。

伙计们,真的,将某种流畅的查询工具(如 QueryDSL)带到 Marklogic 并摆脱这个Rube Goldberg querying machine。

更新 2: 似乎这可以在 ML7 中解决。敬请期待。

谢谢!

【问题讨论】:

  • 伙计们,为什么投反对票?我没有做研究吗?我不是在证明最少的代码更好吗?叹息……

标签: java search xpath marklogic


【解决方案1】:

背景:Java API 是 REST API 上的一个层 API 是 Search API 上的一个层 cts:search 上的一个层

您可以在 Search API 中表达此查询。

使用 Java API,您可以使用查询选项和结构化查询作为 RawCombinedQueryDefinition 进行搜索。

话虽如此,您还可以在 bfa:AppUser 上搜索包含值约束查询的元素查询 bfa:appAccess/@appRole of "ROLE_SYS_ADMIN"

虽然 XPath 很方便,但最好熟悉查询表达式以了解数据库的全部功能和灵活性。

更新 1:

需要考虑的几点:

  • 搜索 API 中的查询有两部分:查询(用 Google 样式的字符串搜索或 JSON 或 XML 结构化搜索表示)和查询选项。 StructuredQueryBuilder 构建结构化搜索。 QueryOptionsBuilder 只构建查询选项。

  • 在 ML 6.0-3 中,REST API 引入了对组合搜索的支持,它在单个请求中提供这两个部分。 Java API 通过 RawCombinedQueryDefinition 类增加了对此类请求的支持。

  • ML7 正在扩展结构化搜索,以减少或消除对结构化搜索查询选项的需求。 StructuredQueryBuilder 在 ML7 中得到了增强,以支持结构化搜索的新功能。在 ML7 中,您将能够完全在 StructuredQueryBuilder 中编写上述示例查询,而无需任何查询选项。

  • 当我们将构建查询选项的代码与 QueryOptionsBuilder 以及 JDOM 或 XOM 进行比较时,很难看到构建器中的 LOC 优势。

  • 您不必在字符串中硬编码查询选项。为了分离关注点,您可以从文件或许多其他来源中读取 JSON 或 XML 查询选项。 (请参阅http://docs.marklogic.com/javadoc/client/com/marklogic/client/io/marker/QueryOptionsReadHandle.html 标记接口的实现。)

  • 查询选项提供声明而不是可执行代码。与之类似的是 Spring 配置文件而不是 SPL 文件。

顺便说一句,虽然 JAXB 非常适合源自 Java 类的设计,但 JAXB 对于源自复杂 XML 模式的设计可能会非常痛苦。搜索模式利用了 XML 模式的强大功能。当我们探索这条路线时,我们得出结论,JAXB 不会帮助提供查询选项的接口。

【讨论】:

  • 谢谢。我正在尝试找到一种方法来生成 XML 查询选项而不会带来太多痛苦。
  • 注明。我想现在我将不得不硬着头皮继续使用持久的 XML 查询选项。我也同意最后一点,将一堆 JAXB 生成的类捆绑在一起,以便它们反映其相应的模式,这最好留给应用程序开发人员。我也期待ML7中StructuredQueryBuilder的增强版。希望它将提供更直观的查询机制。谢谢!
猜你喜欢
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 2012-12-27
  • 1970-01-01
相关资源
最近更新 更多