MaekLogic笔记 _001 _CURD _20210826

1、插入文档
  • API

    xdmp:document-insert(
    $uri as xs:string,
    $root as node(),
    [$permissions as element(sec:permission)*],
    [$collections as xs:string*],
    [$quality as xs:int?],
    [$forest-ids as xs:unsignedLong*]
    ) as empty-sequence()

$uri : 文档存入的路径

$root : 插入文档的内容

加中括号,表示该参数为可选参数

$permissions : 插入的文档该有的权限。默认取 xdmp:default-permissions()权限。文档的创建者至少拥有文档的update权限。

$collections : 插入的文档所属的collection。默认取 xdmp:default-collections()。

$quality : 搜索时,该值影响搜索结果的相关性,正数增加相关性,负数减小相关性。默认值为0.

$forest-ids : 指定文档插入的forest。指定多个时,只插入其中一个,所指定的forest中至少有一个可以做update.。默认插入该数据库所merge的forest。

Marklogic权限管理先不讨论,暂时都使用admin用户,admin有较高权限

实例:

xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
xdmp:document-insert("/books.xml",
<books>
<book id="1010596200" category="编程"> <title>Java编程思想</title> <author>埃克尔</author>
<pubDate>2007-6-1</pubDate>
<pages>880</pages>
<price>30.0</price>
</book>
<book id="1010696100" category="文学"> <title>红楼梦</title> <author>
<firstAuthor>曹雪芹</firstAuthor>
<secondAuthor>高鹗</secondAuthor>
</author>
<pubDate>2012-9-1</pubDate>
<pages>1606</pages>
<price>41.5</price>
</book>
</books>,
xdmp:default-permissions(),
xdmp:default-collections()
)

在qConsole中键入如上代码,选择DataSource 为 自己的数据库,选择Query Type为Xquery , 点击Run, 即可看到输出your query returned an empty sequence 。如果有语法错误,会显示出来原因与大致出错位置。如果文档的uri是新的,会创建该文档,如果是存在的路径,则会覆盖原始文件。

插入成功后,点击Explore 在列表中可以看到刚插入的文档名称 点击对应文档,可以看到内容

2、更新文档

更新主要有4种类型:

  • 1、在节点之后插入节点

    xdmp:node-insert-after(
    $sibling as node(),
    $new as node()
    ) as empty-sequence()

实例:

例如我们要在上例中添加 出版社的信息 到 出版日期 之后

xdmp:node-insert-after(doc("/books.xml")/books/book[title="Java编程思想"]/pubDate, <publisher>机械工业出版社出版</publisher>)

可以看到已经添加了所要的数据

  • 2、在节点之前插入节点
xdmp:node-insert-before(
$sibling as node(),
$new as node()
) as empty-sequence() <!-- 和xdmp:node-insert-after不同的就是插入节点在之前,就不举例了。-->
  • 3、插入子节点
xdmp:node-insert-child(
$parent as node(),
$new as node()
) as empty-sequence()

实例:

例如我们要给页码添加一个子节点-开本

xdmp:node-insert-child(doc("/books.xml")/books/book[title="Java编程思想"]/pages, <format>1/16</format> )

看一下是不是在pages下多了一个子节点format

  • 4、节点更换
xdmp:node-replace(
$old as node(),
$new as node()
) as empty-sequence()

实例:

例如要将书的标题title更新为bookName

xdmp:node-replace(doc("/books.xml")/books/book[title="Java编程思想"]/title, <bookName>Java编程思想第5版</bookName> )

3、查询数据

Marklogic 的查询功能相当丰富,API cts的大部分方法都为查询服务,还有search,方法不多,但是有些很重要。本节主要介绍cts的部分query函数和search下比较重要的函数。

为了更切合生产环境,现在准备如下数据:

xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
xdmp:document-insert("/book/1010596200.xml",
<book id="1010596200" category="编程">
<title>Java编程思想</title>
<author>埃克尔</author>
<pubDate>2007-6-1</pubDate>
<pages>880</pages>
<price>30.0</price>
</book>,
xdmp:default-permissions(),
"book"
)
xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
xdmp:document-insert("/book/1010696100.xml",
<book id="1010696100" category="文学"> <title>红楼梦</title> <author>
<firstAuthor>曹雪芹</firstAuthor>
<secondAuthor>高鹗</secondAuthor>
</author>
<pubDate>2012-9-1</pubDate>
<pages>1606</pages>
<price>41.5</price>
</book>,
xdmp:default-permissions(),
"book"
)
xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
xdmp:document-insert("/book/1010796100.xml",
<book id="1010796100" category="教育"> <title>资格考试</title> <author>教育集团</author>
<pubDate>2016-1-15</pubDate>
<pages>900</pages>
<price>80.8</price>
</book>,
xdmp:default-permissions(),
"book"
)
xdmp:document-insert("/book/1010596101.xml",
<book id="1010596101" category="编程"> <title>java核心技术</title> <author>霍斯特曼</author>
<pubDate>2014-01</pubDate>
<pages>704</pages>
<price>80.8</price>
</book>,
xdmp:default-permissions(),
"book"
)

点击Expore,应该可以看到结果框输出的xml文件列表

举例:

let $query := cts:and-query((
cts:not-query(cts:word-query("思想")),
cts:element-word-query(xs:QName("title"),"java"),
cts:element-value-query(xs:QName("pages"),"704")
))
let $result := cts:search(/book,$query)
return $result

这里有大量的查询操作,通过方法名基本可以知道该方法的功能,我就不列出所有的API了,可以到https://docs.marklogic.com/cts 查看详细的说明,接下来大致介绍一下常用的query函数。

cts:search(
$expression as node()*,
$query as cts:query?,
[$options as (cts:order|xs:string)*],
[$quality-weight as xs:double?],
[$forest-ids as xs:unsignedLong*]
) as node()*

查询主要有两个参数,第一个传入文档节点,可以是某目录下所有文档,可以是整个Content Source;第二个是query语句,是整个查询的精髓。之后大量的xquery代码都是在组装这个query语句,query语句由各种查询条件合并而来,如查询符合某元素值的cts:element-value-query,查询符合某属性的cts:element-attribute-value-query,查询不符合某条件的cts:not-query等等。

下面3个函数使用的时候需要注意各自的不同:

cts:element-value-query(
$element-name as xs:QName*,
[$text as xs:string*],
[$options as xs:string*],
[$weight as xs:double?]
) as cts:element-value-query

这里指定了元素的值,说明只有元素的值完全符合条件才会返回数据,可以理解为此时为“exact”匹配,当然$options可以设置是否大小写敏感,是否空格敏感。

cts:search(//book,cts:element-value-query(xs:QName("title"),"java核心技术")) 会返回id=1010596101的book,但是将其中的“java核心技术”改为“Java核心技术”,只是有一个大小写不同,则查询不到结果。

如果只指定元素名,而不指定其值,则返回包含该元素的所有文档。

cts:search(//book,cts:element-value-query(xs:QName("title")))
<!--会返回所有数据,因为每一条数据都包含title元素。-->
cts:element-word-query(
$element-name as xs:QName*,
$text as xs:string*,
[$options as xs:string*],
[$weight as xs:double?]
) as cts:element-word-query

这里必须指定元素名和一个word, 只要该词出现在这一元素的值中,则会返回数据。

cts:search(//book,cts:element-word-query(xs:QName("title"),"java"))
<!--这里会返回id=1010596101 和id= 1010596200两条数据。后者的标题中”java”有大写字母,但是可以识别到。-->
cts:element-range-query(
$element-name as xs:QName*,
$operator as xs:string,
$value as xs:anyAtomicType*,
[$options as xs:string*],
[$weight as xs:double?]
) as cts:element-range-query

这里还要传一个操作符(支持的操作符[<, <=, >, >= ,!=, =]),既然有操作符,当然就是为了做比较,这个函数可以返回符合某一范围的所有数据,较为常用的是找出某一时间点之前或之后的数据,或者在某一数值范围内的数据。

cts:search(//book,cts:element-range-query(xs:QName("price"),">",50.0)) 可以找出价格大于50元的书籍信息。

但是当我们在qConsole中运行时,却得到一个错误提示:

No decimal element range index for price。原来element-range-query是需要range index的,那这个index从哪里来呢?

marklogic 8 设置range index

下面介绍一下marklogic 8 如何设置element range index:

  1. 登陆Admin Page . 地址:hostname:8001, 我的地址是:http://localhost:8001/

  2. 点击Databases, 点击数据库名,这里点击Teaching,这个数据库是我之前创建的,如果你还没有这个数据库,请参照之前的方法自行创建。

  3. 点击 Element Range Indexes ,右侧页面会展示当前数据库中存在的index。可以看到默认是存在两组inedxes的。

  4. 点击Add

  5. 编辑index

    说明:

    • scalar type: 数据类型,主要是一些数值,日期,字符串,url类型
    • namespace uri: 要绑定元素的命名空间
    • localname: 要绑定元素的名称
    • range value positions: 可以加快查询速度,但是会加长加载数据时间、使数据库庞大,一般取false
    • invalid values: 如何处理无效数据,一般选择拒绝接受无效数据。

实例:

xdmp:document-insert("/book/1010896100.xml",
<book id="1010896100" category="儿童">
<bookName>安徒生童话</bookName>
<author>安徒生</author>
<pubDate>2016-01-25</pubDate>
<publisher>同心出版社</publisher>
<pages>122</pages>
<price>17元</price>
</book>
)

当你已经在price上设置了index为double类型,上例将报错 Invalid lexical value。原来我插入的数据为17元,不符合所要求的数据类型,而我将无效数据的处理设置为reject,因此报错,如果设置值为ignore,则不会报错,可以把数据插入到数据库,但是不建议这样,将不合规的数据插入 后

cts:search(//book,cts:element-range-query(xs:QName("price"),">",50.0))

就会报错。

关于查询,还有一个search函数库:

search:search(
$qtext as xs:string+,
[$options as element(search:options)?],
[$start as xs:unsignedLong?],
[$page-length as xs:unsignedLong?]
) as element(search:response)

举例search:search("java"), 但是在qConsole中运行时,报错Prefix search has no namespace binding。这是因为search不是Marklogic 8 的内嵌函数,我们需要手动引入

import module namespace search = "http://marklogic.com/appservices/search"
at "/MarkLogic/appservices/search/search.xqy";

关于Marklogic的build-in函数,大致有cts、fn、math、rdf、sc、sem、spell、sql、xdmp等。

这一API重要的参数不在于qtext, 而是options,这些内容将在后面重点讲到,此处跳过。

search:parse(
$qtext as xs:string+,
[$options as element(search:options)?],
[$output as xs:string?]
) as element()?

主要用来解析自定义的query,比如你想用TITLE:java核心技术这种形式表示查询标题为”java核心技术”的书籍,可以用下面代码来处理自定义的逻辑:

举例

xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
import module namespace search = "http://marklogic.com/appservices/search"
at "/MarkLogic/appservices/search/search.xqy";
let $q := "TITLE:java核心技术"
let $query := search:parse($q,
<options xmlns="http://marklogic.com/appservices/search">
<constraint name="TITLE">
<value>
<element name="title"/>
</value>
</constraint>
</options>
)
let $query := cts:query($query)
let $result := cts:search(/book,$query)
return $result

将参数$q改为TITLE:红楼梦, 逻辑是一样的。这里的constraint是一个很有用的概念,它可以将查询限定在某些条件下,在做一些复杂查询时可以事半功倍。

举例

search:suggest(
$qtext as xs:string+,
[$options as element(search:options)?],
[$limit as xs:unsignedInt?],
[$cursor-position as xs:unsignedInt?],
[$focus as xs:positiveInteger?],
[$query as element(search:query)*]
) as xs:string*

这个API可以用来做词汇联想,比如在一些搜索界面,输入一个字或词后,会自动提示可能输入的情况,方便用户输入。

$qtext :Sting数组,默认第一个字符串是用来关联查询的关键词,用focus参数可以更改位置。剩下的字符串解析为cts:query,然后用cts:and-query链接,并将结果作为constraint去匹配词库。

$options : 定义查询语法并控制查询条件,参见search:search的 options

$limit : 返回值的个数,默认10条

$cursor-position : 用来确定哪些查询text用来关联匹配

$focus : 用来确定qtext中的关键词

$query : 一个限定qtext查询范围的query

xquery version "1.0-ml";
import module namespace search = "http://marklogic.com/appservices/search"
at "/MarkLogic/appservices/search/search.xqy";
let $options :=
<search:options xmlns="http://marklogic.com/appservices/search">
<default-suggestion-source>
<range type="xs:string" collation="http://marklogic.com/collation/" >
<element name="title"/>
</range>
</default-suggestion-source>
</search:options>
return search:suggest("java", $options)

在运行上面代码之前,需要先在数据库中将title配置上range index,因为对title用到的是range query。上例返回的是一个 {“java核心技术”,“Java编程思想”} 数组,可见用“java”在“title”上搜索时,Marklogic能提供相应的建议。

删除文档

Marklogic的删除操作常用的有文档删除节点删除

1 . 文档删除只需要文档的uri即可,删除成功后返回your query returned an empty sequence. 如果该文档不存在,则返回Document not found

xdmp:document-delete(
$uri as xs:string
) as empty-sequence()

实例:

xquery version "1.0-ml";
xdmp:document-delete("/book/1010896100.xml")

2 . 节点删除需要节点的xpath,删除成功后返回your query returned an empty sequence. 如果所删除的节点不存在返回同样的提示信息

xdmp:node-delete(
$old as node()
) as empty-sequence()

实例:

xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
xdmp:node-delete(doc("/book/1010896100.xml")/book/publisher)

引用声明:https://blog.csdn.net/jiangchao858/article/details/50361880

MaekLogic笔记 _001 _CURD_20210826的更多相关文章

  1. 算法笔记_001:斐波那契数的多种解法(Java)

    本篇文章解决的问题来源于算法设计与分析课程的课堂作业,主要是运用多种方法来计算斐波那契数.具体问题及解法如下: 一.问题1: 问题描述:利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第 ...

  2. 人生苦短_我用Python_javascript_var_function_简单笔记_001

    <!--Javascript_var_001:--> <html> <head> <meta charset="UTF-8"> &l ...

  3. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  4. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  5. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  6. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  7. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  8. NET Core-学习笔记(三)

    这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...

  9. springMVC学习笔记--知识点总结1

    以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...

  10. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

随机推荐

  1. php学习笔记(一)————php类的概念

    <?php //类的概念 /* * 一个类包含自己的属性和函数 * * 属性:属于类自己的常量和变量 * * 方法:就是函数 * * 类是一类事物的抽象 */ //例子: //车就是一种抽象 c ...

  2. blender-主要操作技巧

    E 或 G 或 S 之后 不在同一平面的 处理1切换正视图    alt + z 切换透视模式  s + z +0 变成同一平面

  3. 手把手教你实现Scrapy-Redis分布式爬虫:从配置到最终运行的实战指南

    ## 1.scrapy-redis的环境准备 pip install scrapy-redis 安装完毕之后确保其可以正常导入使用即可. 2. 实现 接下来我们只需要简单的几步操作就可以实现分布式爬虫 ...

  4. Camera | 2.MIPI、CSI基础

    瑞芯微专栏 上一篇我们讲解了camera的一些基础概念和知识. 我们说了,现在的手机由于高分辨率的要求,现在基本上都是基于MIPI.CSI协议来实现的, 本篇讲解MIPI.CSI的一些基础知识. 摄像 ...

  5. QGroupBox自定义样式(仿DotNetBar)

    QSS如下: QGroupBox { border:1px solid gray; border-radius:5px; margin-top:3ex; font-size:10pt; color:# ...

  6. 使用 AWS CLI 管理 S3

    S3 是 AWS 的对象存储服务 S3: Simple Storage Service 创建桶 使用 aws s3 mb 命令创建新的 S3 桶.您需要提供一个全球唯一的桶名称和创建桶的区域. aws ...

  7. 【Python爬虫】之爬取页面内容、图片以及用selenium爬取

    下面不做过多文字描述: 首先.安装必要的库 # 安装BeautifulSoup pip install beautifulsoup4 # 安装requests pip install requests ...

  8. 一个小小空格问题引起的bug

    程序员会遇到一种情况,一个bug排查到最后是由一个很小的问题导致的.在昨天的日常搬砖中遇到一个问题,耽搁了我大半天的时间,最后查明原因让我很无语. 首先介绍一下背景,我是做算法模型训练,目前手上的工作 ...

  9. 图解Zabbix设置邮件报警

    Zabbix设置邮件告警   前提条件: Zabbix Server 和 Zabbix Agent都已安装完毕,并已启动   1.添加主机   2.配置邮件告警,这里以VSFTP服务为例 yum in ...

  10. Kubernetes-2:Pod(k8s最小单元)概念及网络通讯方式

    Pod概念及网络通讯方式 什么是Pod? Pod是Kubernetes的最小单元. 一个Pod是一组紧密相关的容器,是一起运行在同一个工作节点上,以及同一个Linux命名空间中.每个Pod就像是一个独 ...