我有一个函数,我写了一个序列号的生成.功能如下:
declare function generate-instrument-Id( $cnt as xs:int? )
as xs:int {
let $count := if( $cnt and $cnt > 0 ) then $cnt else 1
let $url := '/private/instrumentId-Sequence.xml'
(: this redirection is needed to write id in another
transaction context :)
return xdmp:invoke-function( function() {
let $id := fn:doc( $url )/instrument/@nextId
let $_ := xdmp:node-replace( $id
, attribute nextId { $id + $count } )
return $id
}
)
};
Run Code Online (Sandbox Code Playgroud)
使用以下测试代码,qconsole窗口中的函数可以正常工作:
let res := util:generate-instrument-Id( 1 )
return fn:error( …Run Code Online (Sandbox Code Playgroud) 我很难找到有关输出xdmp:plan意味着什么的详细信息.
有这样一个简单的查询:
xdmp:plan(cts:search(doc(), cts:element-value-query(xs:QName("description"), "some text")))
Run Code Online (Sandbox Code Playgroud)
导致相当长的执行计划:
<qry:query-plan xmlns:qry="http://marklogic.com/cts/query">
<qry:expr-trace>...</qry:expr-trace>
...
<qry:partial-plan>
<qry:term-query weight="1">
<qry:key>16037778974159125508</qry:key>
<qry:annotation>element(description,value("some","text"))</qry:annotation>
</qry:term-query>
</qry:partial-plan>
...
<qry:ordering></qry:ordering>
<qry:final-plan>
<qry:and-query>
<qry:term-query weight="1">
<qry:key>16037778974159125508</qry:key>
<qry:annotation>element(description,value("some","text"))</qry:annotation>
</qry:term-query>
</qry:and-query>
</qry:final-plan>
<qry:info-trace>Selected 0 fragments to filter</qry:info-trace>
<qry:result estimate="0"></qry:result>
</qry:query-plan>
Run Code Online (Sandbox Code Playgroud)
提到文档的唯一部分xdmp:plan是其文档本身.除此之外,我找不到任何其他东西.我想了解一些关于例如qry:key或qry:annotation真正含义的细节.
有没有我缺少的文件描述可能的输出xdmp:plan.由于这是一个非常有价值的工具,以便了解查询性能,我希望它有很好的文档记录.
编辑:我发现的这个marklogic博客文章给出了一些如何解释查询计划的例子.
不过,我觉得自己像一个博客帖子应该不会是唯一合理的文档,这个工具.
我仍在思考一些问题:
partial-plan和a 之间的区别final-plan.是一个final-plan合并的所有partial-plans?什么时候partial-plan使用?部分计划似乎有助于制约.在索引解析阶段使用这些约束来查找候选片段ID吗?什么样的角色一final-plan玩吗?是否final-plan用于在索引解析后过滤掉误报?有时我可以在查询计划中找到它:
<qry:elem-word-trace text="computer" elem-name="title" …Run Code Online (Sandbox Code Playgroud) 我们的一个应用程序刚刚遇到了一些令人讨厌的死锁.我很难重新创建问题,因为死锁(或堆栈跟踪)没有立即出现在我的java应用程序日志中.
令我惊讶的是,marklogic java api重试失败的请求(例如,由于死锁).如果您的请求不是多语句请求,这可能是有意义的,否则我不确定它是否确实如此.
因此,请坚持这个死锁问题.我创建了一个简单的代码片段,其中我故意创建了一个死锁.该片段创建一个文档test.xml,然后尝试从两个不同的事务中读取和写入,每个事务都在一个新线程上.
public static void main(String[] args) throws Exception {
final Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
final Logger ok = (Logger) LoggerFactory.getLogger(OkHttpServices.class);
root.setLevel(Level.ALL);
ok.setLevel(Level.ALL);
final DatabaseClient client = DatabaseClientFactory.newClient("localhost", 8000, new DatabaseClientFactory.DigestAuthContext("username", "password"));
final StringHandle handle = new StringHandle("<doc><name>Test</name></doc>")
.withFormat(Format.XML);
client.newTextDocumentManager().write("test.xml", handle);
root.info("t1: opening");
final Transaction t1 = client.openTransaction();
root.info("t1: reading");
client.newXMLDocumentManager()
.read("test.xml", new StringHandle(), t1);
root.info("t2: opening");
final Transaction t2 = client.openTransaction();
root.info("t2: reading");
client.newXMLDocumentManager()
.read("test.xml", new StringHandle(), t2);
new Thread(() -> …Run Code Online (Sandbox Code Playgroud) 当我查找 XQuery 示例时,有时会看到使用的运算符=>。
我试图寻找它的含义,但找不到任何东西。由于我使用的是 MarkLogic,因此它可能仅适用于 MarkLogic,但我对此表示怀疑。
从示例中我知道它以某种方式将功能链接在一起,但我想知道发生了什么。
这些是我发现的一些例子:
let $map := map:map()
=>map:with("some-key",<info>45683</info>)
return <result>{$map}</result>
Run Code Online (Sandbox Code Playgroud)
let $employees := op:from-view("main", "employees")
let $expenses := op:from-view("main", "expenses")
let $totalexpenses := op:col("totalexpenses")
return $employees
=> op:join-inner($expenses, op:on(
op:view-col("employees", "EmployeeID"),
op:view-col("expenses", "EmployeeID")))
=> op:group-by(op:view-col("employees", "EmployeeID"),
("FirstName", "LastName",
op:view-col("expenses", "Category"),
op:sum($totalexpenses,
op:view-col("expenses", "Amount"))))
=> op:order-by(op:view-col("employees", "EmployeeID"))
=> op:result()
Run Code Online (Sandbox Code Playgroud) 让我们有一个相当简单的TDE架构:
<tde:template xmlns:tde='http://marklogic.com/xdmp/tde'>
<tde:description>testing a TDE view</tde:description>
<tde:context>/test</tde:context>
<tde:enabled>true</tde:enabled>
<tde:rows>
<tde:row>
<tde:schema-name>sitefusion</tde:schema-name>
<tde:view-name>test</tde:view-name>
<tde:columns>
<tde:column>
<tde:name>name</tde:name>
<tde:scalar-type>string</tde:scalar-type>
<tde:val>name</tde:val>
<tde:nullable>false</tde:nullable>
<tde:collation>http://marklogic.com/collation/en/S1</tde:collation>
</tde:column>
</tde:columns>
</tde:row>
</tde:rows>
</tde:template>
Run Code Online (Sandbox Code Playgroud)
此架构具有整理http://marklogic.com/collation/en/S1含义case and diacritic insensitive.考虑到这一点,我插入了一个带有第一个char大写名称的测试文档Test:
let $doc :=
<test>
<name>Test</name>
</test>
return xdmp:document-insert("/test/1.xml", $doc);
let $data := xdmp:sql("select name from test")
return json:array-pop($data)[2];
Run Code Online (Sandbox Code Playgroud)
该xquery的输出是name的预期值Test.
现在让我们更新name并test在其中放入一个小写:
let $doc :=
<test>
<name>test</name>
</test>
return xdmp:document-insert("/test/1.xml", $doc);
let $data := xdmp:sql("select name from test")
return (
json:array-pop($data)[2], …Run Code Online (Sandbox Code Playgroud) 我们正在开发一个存储大量数据的企业应用程序。在我们的应用程序中,我们强制用户创建多个路径范围索引以加快搜索速度。
早些时候,我们利用路径范围索引来使用cts:path-range-query()加快搜索速度,但现在我发现使用cts:element-query()可以获得相同的结果,而无需创建路径范围索引。
例如 -
使用cts:path-range-query() -> 这里我需要为 /tXML/Message/INVENTORY/ASNId 创建路径范围索引
xquery version "1.0-ml";
cts:uris('', (), cts:and-query((cts:collection-query("integration"),
cts:path-range-query("/tXML/Message/INVENTORY/ASNId", "=", "10121600"))))
使用cts:element-query() -> 这里我不需要创建路径范围索引。
xquery version "1.0-ml";
cts:uris('', (), cts:and-query((cts:collection-query("integration"),
cts:element-query(xs:QName("tXML"),cts:element-query(xs:QName("Message"), cts:element-query(xs:QName("INVENTORY"), cts:element-value-query(xs:QName("ASNId"), "10121600")))))))
我的问题是,
如果我使用 cts:element-query() 得到与 cts:path-range-query() 相同的结果,那么为什么我需要强制用户创建路径范围索引?。
哪个查询适合大量数据?.(cts:element-query()或cts:path-range-query())
请帮我找到这两个问题的答案。
假设我在 MarkLogic 中有三个文档,如下所示,
<employee>
<name>a</name>
<age>10</age>
</employee>
<employee>
<name>b</name>
<age>10</age>
</employee>
<employee>
<name>c</name>
<age>10</age>
</employee>
Run Code Online (Sandbox Code Playgroud)
文件 uris - /employee/a, /employee/b, /employee/c分别。我已经为"/employee/age"作为int标量 stype创建了路径范围索引。
我的要求是 - 获取路径范围索引的所有值的总和"/employee/age"。
我试过-sum(cts:values(cts:path-reference("/employee/age")))但它在这里返回 10 作为输出总和我期待 30 作为输出总和。
上述问题的解决方案是什么?
除了搜索 PPT、PDF 等二进制文件的内容之外,还有其他方法吗?
使用 xdmp:document-filter() 函数将其转换为 X HTML 格式并进行搜索?
我的要求是,仅当路径范围索引值以某个单词开头或结尾时,我才想返回文档 URI。
根据 MarkLogic 文档,我只能使用 ">、<、<=、>=、=、!=" 来比较路径范围索引值,但在我的要求中,我想使用 fn:starts-with() 或 fn:ends-和()。
有什么办法可以满足这个要求吗?
如何从查询控制台找到可能的查询?
我知道时间段。
它在历史仪表板中不像在历史仪表板中那样可用。我只能看到过去 10 分钟的长时间运行的查询。
也许如果我能获得正确的 URI 来探索应用程序服务或计量数据?