【发布时间】:2015-03-30 19:22:11
【问题描述】:
我是 MarkLogic 的新手,我们正在为我们的产品用例评估 MarkLogic。
我们评估了一些 NoSQL 数据库,例如 MongoDB、Couchbase 等。
我正在寻找以下类型的查询搜索。
(条件1或条件2)与(条件3或条件4)与(条件5)
MarkLogic 可以提供这种类型的搜索查询吗?
我刚刚开始学习 MarkLogic 并试图了解架构。
谢谢, 萨米尔
【问题讨论】:
我是 MarkLogic 的新手,我们正在为我们的产品用例评估 MarkLogic。
我们评估了一些 NoSQL 数据库,例如 MongoDB、Couchbase 等。
我正在寻找以下类型的查询搜索。
(条件1或条件2)与(条件3或条件4)与(条件5)
MarkLogic 可以提供这种类型的搜索查询吗?
我刚刚开始学习 MarkLogic 并试图了解架构。
谢谢, 萨米尔
【问题讨论】:
是的,MarkLogic 为此类功能提供了一些高级库。看看搜索 API。
从这里开始:https://developer.marklogic.com/learn/2009-07-search-api-walkthrough
更详尽的文档在这里:https://docs.marklogic.com/guide/search-dev/search-api
【讨论】:
如上所述,MarkLogic 可以通过多种方式处理这种逻辑。
例如,这就是您可以使用 CTS 库设置搜索查询的方式(我强烈推荐 CTS 库,因为它使用索引更好,并且它们的构建更加灵活):
cts:search(//elementName,
cts:and-query((
cts:element-attribute-value-query(xs:QName("entry"), xs:QName("private"), "true"),
cts:or-query((
cts:element-attribute-value-query(xs:QName("entry"), xs:QName("forced"), "false"),
cts:element-attribute-value-query(xs:QName("entry"), xs:QName("forced"), "pending")
))
))
)
这个 sn-p 显示 AND 和 OR 逻辑。 cts:and-query() 和 cts:or-query() 函数可以获取节点列表。上面的查询说:“找到一个元素(称为 elementName),它的属性为 private='true' 并且具有以下任一属性:forced='true' 或forced='pending'”。
对于更简单的数据,您可以通过执行以下操作来使用 xQuery 谓词:
for $node in $xml/parent/child[@param1 eq "test" AND @param2 eq "OK"]/grandchild[@service eq "yahoo" or @service eq "google"]
return $node
【讨论】:
对原始问题的简短回答是“是”。 “如何”的细节将取决于用于表达查询的方法。
reference architecture 建议使用三层方法,如果您使用其中一种方法,则使用 Java 或 Node.js Client APIs,或者如果您在中间层中使用不同的语言,则使用 HTTP 调用 REST API。
如果您在 MarkLogic 的应用服务器(通常作为两层架构)中工作,您也可以使用 Search API(如 wst 所述)。从 MarkLogic 8 开始,您可以使用 XQuery 或服务器端 JavaScript 来做到这一点。
【讨论】: