Java XQuery持续时间长导致内部服务器错误(MarkLogic)

Java XQuery持续时间长导致内部服务器错误(MarkLogic),java,marklogic,Java,Marklogic,我目前正在使用MarkLogic提供的JavaAPI运行一些查询。我通过向我的库中添加所需的依赖项来安装它。该连接是使用 DatabaseClient client = DatabaseClientFactory.newClient("localhost", 8000, secContext, ConnectionType.DIRECT); 从这里开始,使用下面显示的代码运行一些XQuery ServerEvaluationCall evl = client.newServerEval().x

我目前正在使用MarkLogic提供的JavaAPI运行一些查询。我通过向我的库中添加所需的依赖项来安装它。该连接是使用

DatabaseClient client = DatabaseClientFactory.newClient("localhost", 8000, secContext, ConnectionType.DIRECT);
从这里开始,使用下面显示的代码运行一些XQuery

ServerEvaluationCall evl = client.newServerEval().xquery(query);
EvalResultIterator evr = evl.eval();
while(evr.hasNext()){
//Do something with the results
}
但是,某些查询需要很长时间才能处理,导致内部错误。因此,除了减少所需的查询时间外,我想知道是否有办法克服这一问题?例如,增加连接时间限制

==更新===

使用的查询

xquery version "1.0-ml";

let $query-opts := /comments[fn:matches(text,".*generation.*")]

return(
$query-opts, fn:count($query-opts), xdmp:elapsed-time()
)
我知道所使用的正则表达式可以很容易地被word query替换。但对于这个例子,我只想使用正则表达式进行搜索

示例数据

<comments>
<date_commented>1998-01-14T04:32:30</date_commented>
<text>iCloud sync settings are not supposed to change after an iOS update. In the case of iOS 10.3 this was due to a bug.</text>
<uri>/comment/000000001415898</uri>
</comments>

根据您提供的数据,我将使用xdmp:estimate和cts查询

xdmp:estimate(cts:search(doc(), cts:and-query((
  cts:directory-query('/comment/'),
  cts:element-word-query(xs:QName("text"), "generation")
))))
这将在/comments/目录中的所有文档中搜索包含单词generation的元素文本。如您所知,这将只使用索引,而不需要加载/解析文档


这也不会发现任何误报,因为如果显示的数据正确,每个文档/片段只有一个文本元素。

根据您提供的数据,我将使用xdmp:estimate和cts查询

xdmp:estimate(cts:search(doc(), cts:and-query((
  cts:directory-query('/comment/'),
  cts:element-word-query(xs:QName("text"), "generation")
))))
这将在/comments/目录中的所有文档中搜索包含单词generation的元素文本。如您所知,这将只使用索引,而不需要加载/解析文档


这也不会发现任何误报,因为如果显示的数据正确,则每个文档/片段只有一个文本元素。

选择和更新是否都有问题?或者你能解释一下什么样的查询需要更多的时间吗?这是一个非常简单的查询,使用word query检查某个单词并返回文档,然后我使用fn:count来确定文档的大小。但它正在计算数百万份文件,这需要很多时间@Ramachandra Reddyin代替fn:count您可以使用xdmp:estimate,它不需要将文档加载/解析到内存中,并且应该快得多。是的,我想过用它。但问题是xdmp:基于索引估计计数。因此,如果假设我使用路径/数据[某些条件],它仍然会返回所有包含路径/数据的文档条目的计数,即使由于应用的条件,返回的结果仅为1个文档@瓦格纳·迈克莱娅:没错。你能发布你的查询+数据吗?您可以尝试转换数据,使其每个片段不具有多个节点。所以每个片段的路径/数据都是唯一的。选择和更新都有问题吗?或者你能解释一下什么样的查询需要更多的时间吗?这是一个非常简单的查询,使用word query检查某个单词并返回文档,然后我使用fn:count来确定文档的大小。但它正在计算数百万份文件,这需要很多时间@Ramachandra Reddyin代替fn:count您可以使用xdmp:estimate,它不需要将文档加载/解析到内存中,并且应该快得多。是的,我想过用它。但问题是xdmp:基于索引估计计数。因此,如果假设我使用路径/数据[某些条件],它仍然会返回所有包含路径/数据的文档条目的计数,即使由于应用的条件,返回的结果仅为1个文档@瓦格纳·迈克莱娅:没错。你能发布你的查询+数据吗?您可以尝试转换数据,使其每个片段不具有多个节点。因此,每个片段的路径/数据都是唯一的。这个好答案的一个脚注是:与其增加超时(如果数据库的大小增加,超时可能再次失败),典型的策略是在多个请求中翻页结果。感谢您的回答。但我想问最后一件事。根据您的代码,我试图替换cts:element。。。。使用/comments[fn:matchestext,.*generation.*]时,所花费的时间突然增加了很多。这有什么道理吗?我试着自己运行/comments[fn:matchestext,.*generation.*],不到一秒钟就完成了@Wagner MichaelWildcard搜索是罪魁祸首。根据您的用例,您可以查看lexicon expand、lexicon expansion limit和limit check选项和/或通配符索引@WhiteSolstice。XPath表达式加载包含注释元素的每个文档片段。在第二个过滤阶段,它过滤掉所有不包含regexp生成的单词的片段。这会影响很多表演。为了更好地理解这一点,请使用xdmp:plan…比较两个查询。。。。不过,我不知道为什么XPath本身的速度要快得多。可能是因为查询/片段已经被缓存。这个好答案的一个脚注是:与其增加超时(如果数据库的大小增加,超时可能再次失败),典型的策略是在多个请求中翻页结果。谢谢
谢谢你的回答。但我想问最后一件事。根据您的代码,我试图替换cts:element。。。。使用/comments[fn:matchestext,.*generation.*]时,所花费的时间突然增加了很多。这有什么道理吗?我试着自己运行/comments[fn:matchestext,.*generation.*],不到一秒钟就完成了@Wagner MichaelWildcard搜索是罪魁祸首。根据您的用例,您可以查看lexicon expand、lexicon expansion limit和limit check选项和/或通配符索引@WhiteSolstice。XPath表达式加载包含注释元素的每个文档片段。在第二个过滤阶段,它过滤掉所有不包含regexp生成的单词的片段。这会影响很多表演。为了更好地理解这一点,请使用xdmp:plan…比较两个查询。。。。不过,我不知道为什么XPath本身的速度要快得多。可能是因为查询/片段已被缓存。