Marklogic是企业级的NOSQL数据库。存储基于XML的以文档为中心的数据。提供了强大高效的Search API。Marklogic 6之前主要是基于XQuery的API,6之后推出了相应的Java API。目前Java API还在评估中,项目中还主要是用XQuery实现。这个产品在美国用的比较多,在国内用户寥寥无几。所以网上很少能找到相关的资料。好在其官方文档相对完备,开发中大部分的问题也都可以解决。但有些问题要颇费周折才能找出其中的原因,接下来要说的wildcard search(通配符搜索)就是这样。故用此文记录下来,作为参考。
我们有个需求,需要根据数据库中某个元素的的值支持通配符搜索,而且是以输入的关键字为头结合通配符的尾部去匹配结果。例如:
数据库中有3个xml数据,其中title元素分别为:<title>Wildcard search test</title>,<title>FW: Wildcard search test</title>,<title>RE: Wildcard search test</title>;如果用户输入“Wildcard search *”关键字来查询,只能返回第一个xml,因为第二,三个不是以"Wildcard search"开头的。我在数据库中插入了三条测试数据,然后用Search API根据需求实现如下的Search逻辑。
(:insert test xml:)
xdmp:document-insert("/test/test1.xml",
<test id="test1">
<from>user1</from>
<to>user2</to>
<title>Wildcard search test</title>
<time>2014-05-10T11:07:49.000Z</time>
</test>
)
xdmp:document-insert("/test/test2.xml",
<test id="test2">
<from>user2</from>
<to>user3</to>
<title>FW: Wildcard search test</title>
<time>2014-05-11T11:07:49.000Z</time>
</test>
)
xdmp:document-insert("/test/test3.xml",
<test id="test3">
<from>user3</from>
<to>user2</to>
<title>RE: Wildcard search test</title>
<time>2014-05-12T11:07:49.000Z</time>
</test>
)
xquery vers