《MarkLogic Search开发人员指南》讨论了如何组合使用字符串查询和结构化查询,在这些查询中,请求被ANDed在一起。我有一个由31个术语组成的字符串查询和一个由索引开始日期字段组成的结构化查询。搜索在不到20秒的时间内完成。以下是参数映射的转储:
2021-09-24 22: 49: 13.306 Info: resource.xqy paramMap: {
"pageLength": 10,
"q": "(T1 OR \"T2\" OR \"T3\" OR \"e-T4\" OR \"T5\" OR
\"T6\" OR \"T7\" OR \"T8\" OR \"T9\" OR \"T10\" OR
\"T11\" OR \"T12\" OR \"T13\" OR \"T14\" OR \"T15\" OR
\"T16\" OR \"T17\" OR \"T18\" OR \"T19\" OR \"T20\" OR
\"T21\" OR \"T22\" OR \"T23\" OR \"T24\" OR \"T25\" OR
\"T26\" OR \"T27\" OR \"T28\" OR \"T29\" OR \"T30\" OR \"T31\")",
"format": "json",
"options": "all",
"structuredQuery": "{
\"query\":{
\"queries\":[
{
\"and-query\":{
\"queries\":[
{
\"and-query\":{
\"queries\":[]
}
},
{
\"range-query\":{
\"range-operator\":\"GE\",
\"value\":[\"2000-09-10T04:00:00.000Z\"],
\"range-option\":[],
\"json-property\":\"primarydate\",
\"type\":\"xs:dateTime\"
}
}
]
}
},
{
\"operator-state\":{
\"operator-name\":\"results\",
\"state-name\":\"highlight\"
}
}
]
}
}",
"start": 1
}但是,如果我添加一个比较的结束日期,搜索需要超过5分钟才能完成。以下是修改后的参数映射:
2021-09-24 22: 57: 44.930 Info: resource.xqy paramMap: {
"pageLength": 10,
"q": "(T1 OR \"T2\" OR \"T3\" OR \"e-T4\" OR \"T5\" OR
\"T6\" OR \"T7\" OR \"T8\" OR \"T9\" OR \"T10\" OR
\"T11\" OR \"T12\" OR \"T13\" OR \"T14\" OR \"T15\" OR
\"T16\" OR \"T17\" OR \"T18\" OR \"T19\" OR \"T20\" OR
\"T21\" OR \"T22\" OR \"T23\" OR \"T24\" OR \"T25\" OR
\"T26\" OR \"T27\" OR \"T28\" OR \"T29\" OR \"T30\" OR \"T31\")",
"format": "json",
"options": "all",
"structuredQuery": "{
\"query\":{
\"queries\":[
{
\"and-query\":{
\"queries\":[
{
\"and-query\":{
\"queries\":[]
}
},
{
\"and-query\":
{
\"queries\":
[
{
\"range-query\":
{
\"range-operator\":\"GE\",
\"value\":[\"2000-09-10T04:00:00.000Z\"],
\"range-option\":[],
\"json-property\":\"primarydate\",
\"type\":\"xs:dateTime\"
}
},
{
\"range-query\":{
\"range-operator\":\"LE\",
\"value\":[\"2010-09-10T04:00:00.000Z\"],
\"range-option\":[],
\"json-property\":\"primarydate\",
\"type\":\"xs:dateTime\"
}
]
}
}
]
}
},
{
\"operator-state\":{
\"operator-name\":\"results\",
\"state-name\":\"highlight\"
}
}
]
}
}",
"start": 1
}考虑到缩短的时间范围,我希望它能更快地完成。
这是怎么回事?MarkLogic数据库版本为10.0-5。
发布于 2021-10-01 17:03:36
有几件事可以尝试一下。首先,将其隔离到qconsole。我不确定确切的接口是什么(Java API?)您将从获取日志,但可以将其转换为简单的查询条件,如(手动编辑):
let queryCondition = cts.andQuery([
cts.jsonPropertyRangeQuery("primarydate", ">=", xs.dateTime("2000-09-10T04:00:00.000Z"),
cts.jsonPropertyRangeQuery("primarydate", "<=", xs.dateTime("2010-09-10T04:00:00.000Z"),
cts.wordQuery("T1", "T2", "T3")
]) 或者类似的。
通过cts.estimate(querycondition)或cts.uris(null, null, queryCondition)只测试索引解析部分(而不是文档检索
如果这重现了错误,您可以从那里调优查询。
我的猜测是你的系统超载了。这不是一个非常大的查询,而且您的数据库也不大,所以这些时间太高了。您可能内存不足,正在交换内存,或者有其他系统问题,可能是磁盘问题。
但无论哪种方式,我都会首先将其放入qconsole中,并准确隔离正在运行的查询,以便进行索引解析,并通过删除查询位直到找到运行速度最慢的最小组合来引起问题。
还要注意,您可以在qconsole缓冲区的末尾返回xdmp.queryMeters()或cts.plan(queryCondition),这将会起作用。这两种方法都不需要search.search()转换。
发布于 2021-10-06 13:29:30
好消息。如果xdmp.estimate(查询)运行得很快,那么范围索引的变化可能并不重要(所有的索引工作都是在估计查询时进行的。
听起来像是中间件或者MarkLogic之外的东西。
https://stackoverflow.com/questions/69387515
复制相似问题