我正在编写需要返回XML节点的修改版本的代码,而不更改父文档中的原始节点.
如何复制/克隆节点,以便原始上下文不会连接到/受其影响?我不希望对此节点进行更改以更改父文档中的原始节点,只更改我的函数返回的副本.
我正在寻找的东西与cts非常相似:高亮在内部做:
返回节点的副本,将与查询匹配的任何文本替换为指定的表达式.您可以使用此功能轻松突出显示查询中的任何文本.与fn:replace和其他与文字文本匹配的XQuery字符串函数不同,cts:highlight匹配与搜索匹配的每个术语,包括词干匹配或具有不同大小写的匹配.[marklogic docs> cts:highlight]
我正在使用MarkLogic 9开发基于Web的搜索应用程序.我有一个查询构建接口,允许用户将字符串输入到与db中文档的特定JSON属性相对应的文本框中.这个想法是用户可以输入搜索条件,就像cts.parse(我使用服务器端javascript,而不是XQuery)所期望的那样,因此他们的搜索可能是任意复杂的,我不必处理自己解析查询.然而,经过一些测试,我发现了一个关于在布尔逻辑中使用括号的奇怪现象.也就是说,当你在括号中添加像cat和(dog OR bird)这样的语句时,cts.parse会将OR误认为是搜索词.
我将从我的网站提供一个实际的例子:
我构造了一个绑定对象来将查询绑定到我的文档的元素,
var qOpts = ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded"];
var bindings = {
main: function(operator, values, options){
return(
cts.orQuery([
cts.jsonPropertyWordQuery('title',values,qOpts),
cts.jsonPropertyWordQuery('abstract',values,qOpts),
cts.jsonPropertyWordQuery('meshterms',values,qOpts),
])
);
},
}Run Code Online (Sandbox Code Playgroud)
我的服务器端脚本调用,例如,
cts.parse('main:'+params.mainQuery,bind)Run Code Online (Sandbox Code Playgroud)
以下是输入的字符串和返回的查询的一些示例:
cts.orQuery([cts.jsonPropertyWordQuery("title", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("abstract", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("meshterms", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.wordQuery("heart", ["lang=en"], 1), cts.wordQuery("lung", ["lang=en"], 1)], [])Run Code Online (Sandbox Code Playgroud)
这个适当地为"大脑"术语的3个字段(标题,摘要,网格术语)生成jsonPropertyWordQuery,但是对于其他两个术语不能这样做,它只是生成一个cts.wordQuery().
cts.orQuery([cts.jsonPropertyWordQuery("title", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("abstract", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("meshterms", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.andQuery([cts.wordQuery("heart", ["lang=en"], 1), cts.wordQuery("lung", ["lang=en"], 1)], ["unordered"])], [])Run Code Online (Sandbox Code Playgroud)
cts.orQuery([cts.jsonPropertyWordQuery("title", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("abstract", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], …Run Code Online (Sandbox Code Playgroud)var marklogic=require('marklogic');
var ins=marklogic.createDatabaseClient({'host':'localhost','port':'7010','user':'admin','password':'admin',});
var qb=marklogic.queryBuilder;
ins.documents.query(
qb.propertiesFragment(
qb.value("Author","Akhilesh Sabbisetti"))
).result(function(matches){
matches.forEach(function(match){
console.log(match.uri);
});
});
Run Code Online (Sandbox Code Playgroud)
上面的代码应该只适用于文档的属性,但它不是那样的.我得到了无关紧要的结果.请更正我的代码....
在我的 MarkLogic 数据库中,我们有符合 URI 格式的文档,其方式如下:
/documents/12345.xml
/documents/12-abc.xml
/documents/abc-123-def.xml
/12345.xml
Run Code Online (Sandbox Code Playgroud)
我想在 cts:uri-match 中运行正则表达式来仅选择那些符合格式的 uri
> /documents/{integer-values}.xml
Run Code Online (Sandbox Code Playgroud)
请建议如何使这项工作有效。数据库中有数百万个文档,我只想选择符合上述格式的uri,将对这些文档运行CORB进程进行转换。我不想获取所有 URI,然后运行 fn:matches 查询来完成这项工作。
即使将文件日志级别设置为finest(最低日志级别),调试消息也不会在MarkLogic 9.0-9.1的“错误日志”中记录。
在QConsole中,xdmp:log('xyz', 'debug')在
从管理UI的组配置中将文件日志级别设置为“最高级 ”(也尝试了其他日志级别)之后使用,但未记录调试消息。
在托管 (dls:document-insert-and-manage(...)) 文档上使用 xpath 时,我想在此文档上使用 xpath 表达式来仅检索实际文档,尤其是对于其他用户。
使用 xpath 我要么得到文档的所有版本,要么没有文档。
我尝试在文档上设置权限。
限制 URI 只是为了创建。
保护路径无济于事,因为所有版本的 xpath 都是相同的。
是否有可能限制某些用户仅获取最新版本?
我们正在使用 Marklogic 9.0.8
设置文档
xquery version "1.0-ml";
import module namespace dls = "http://marklogic.com/xdmp/dls" at "/MarkLogic/dls.xqy";
declare variable $uri :="/smtextdocuments/9114.xml";
declare variable $document := document {
<envelope>
<instance>
<smtextdocuments>
<uri>/smtextdocuments/9114.xml</uri><id>9114</id>
<documentcontent>MyText</documentcontent>
</smtextdocuments>
</instance>
</envelope>
};
let $d := dls:document-insert-and-manage($uri,fn:true(), $document,
"Manage textdocuments",
(
xdmp:permission("dls-user", "read"),
xdmp:permission("dls-internal", "read"),
xdmp:permission("dls-internal", "update")),
()
)
return $d
Run Code Online (Sandbox Code Playgroud)
检索文档时会导致 2 或 none 元素,具体取决于实际用户的权限
xquery version "1.0-ml";
<queryresult> …Run Code Online (Sandbox Code Playgroud) 我遇到了时态函数“ temporal.documentDelete ”,它“逻辑删除”MarkLogic 数据库中的时态文档,从而将其从最新集合中删除。但该文档仍未从 MarkLogic 数据库中物理删除。您仍然可以使用其 URI 检索已删除的文档。
有没有什么办法,我也可以物理删除摄取到我的 MarkLogic 数据库中的临时文档?
我试着用fn:string-pad()xquery函数抛出错误的未定义函数,使用Marklogic版本9
我正在做一些锻炼以找出性能方面哪个更好,无论是元素值查询还是路径范围查询。
我发现使用路径范围查询的搜索比元素值查询慢一点。
即使加载了额外的路径范围索引,有没有人知道使用路径范围查询搜索的速度缓慢。
我使用了下面的代码。
xdmp:document-delete("/aname4.xml")
xdmp:document-insert("/aname1.xml",
<name><fname>John</fname><mname>Rob</mname><lname>Goldings</lname></name>),
xdmp:document-insert("/aname2.xml",
<name><fname>Jim</fname><mname>Ken</mname><lname>Kurla</lname></name>),
xdmp:document-insert("/aname3.xml",
<name><fname>Ooi</fname><mname>Ben</mname><lname>Fu</lname></name>),
xdmp:document-insert("/aname4.xml",
<name><fname>James</fname><mname>Rick</mname><lname>Tod</lname></name>)
create path range index "/name/fname"
checked response time with following search code
cts:search(doc(),cts:path-range-query("/name/fname","=","Jim"),"filtered")
cts:search(doc(),
cts:element-value-query(xs:QName("fname"),"jim"),
"filtered")
Run Code Online (Sandbox Code Playgroud)
在使用路径范围查询时,我应该考虑哪些特定的事情
任何建议都将受到高度赞赏,因为它有助于我们设计高效的搜索代码。
我正在尝试获取 MarkLogic 中的森林数据目录。我使用以下方法获取数据目录...使用服务器评估调用接口以管理员身份运行查询。如果没有,请告诉我如何获取森林数据目录
ServerEvaluationCall forestDataDirCall = client.newServerEval()
.xquery("admin:forest-get-data-directory(admin:get-configuration(), admin:forest-get-id(admin:get-configuration(), \"" + forestName +"\"))");
for (EvalResult forestDataDirResult : forestDataDirCall.eval()) {
String forestDataDir = null;
forestDataDir = forestDataDirResult.getString();
System.out.println("forestDataDir is " + forestDataDir);
}
Run Code Online (Sandbox Code Playgroud) marklogic ×10
marklogic-9 ×10
xquery ×3
bi-temporal ×1
java ×1
javascript ×1
marklogic-8 ×1
nosql ×1
rest ×1