使用Marklogic的Java搜索API和XQuery / XSLT API对XPath进行搜索

时间:2013-08-28 19:19:29

标签: java search xpath marklogic

我有以下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)我可以在String文件中对我的XCC查询进行硬编码,并尝试使用参数占位符来插入我需要的数据并通过XCC会话检索。或

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

伙计们,真的,将一些像QueryDSL这样流畅的查询工具带到Marklogic并摆脱这个Rube Goldberg querying machine

更新2:好像可以在ML7中解决这个问题。期待它。

谢谢!

1 个答案:

答案 0 :(得分:4)

背景: Java API是REST API上的一层,是Search API上的一层,是cts上的一层:搜索

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

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

所有这一切,您还可以在bfa上搜索元素查询:AppUser包含bfa上的值约束查询:appAccess / @ appRole“ROLE_SYS_ADMIN”

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

更新1:

需要考虑的一些事项:

  • Search 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文件。

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