MarkLogic特定的方式(或更快的方式)进行位置查询?

时间:2012-08-06 16:54:44

标签: marklogic

我有以下查询可行,但速度非常慢,因为我猜它必须查看每个文档而不是使用索引:

xquery version "1.0-ml";

declare namespace appl="http://ap.org/schemas/03/2005/appl";
declare namespace appls="http://ap.org/schemas/09/2011/applsearch";

let $p := cts:and-query((
      cts:element-range-    query(xs:QName("appls:ArrivalDateTime"),">=",fn:dateTime(xs:date("2003-01-01"), xs:time("00:00:00"))),
      cts:element-range-query(xs:QName("appls:ArrivalDateTime"),"<=",fn:dateTime(xs:date("2003-01-31"), xs:time("23:59:59"))),
      cts:element-value-query(xs:QName("appl:MediaType"), "text")
      ))

let $results := cts:search(fn:doc(), $p, "unfiltered")
return
 for $result in $results

where cts:contains($result//appl:block/appl:p[position()=last()], "information from:")
return fn:document-uri($result)

我尝试使用cts:element-word-query并打开了标点符号敏感选项​​,但我认为由于空间限制我们没有在数据库中对其进行索引,所以它不起作用。

我会喜欢任何关于如何加速或改进它的建议。如果添加索引是我唯一的办法,我想我可以回到我们的管理员,看看有什么可能,但希望我不必走那条路。

3 个答案:

答案 0 :(得分:1)

我认为确实存在一个包含各个元素位置的索引。最好的解决方案我担心的是复制appl:p[position()=last()]元素并给它一个唯一的名称,因此你可以直接使用cts:element-value-query

如果where子句过滤掉大量误报,并且这些情况根本不包含值为'information from:'的appl:p,那么使用{ {1}}可以提供很多帮助。

您不一定需要索引才能使用cts:element-word-query

HTH!

答案 1 :(得分:0)

我不确定unfiltered在此查询中有多大帮助:大部分时间可能会花费在cts:contains表达式中。一般来说,内置过滤非常快。

无论如何,我要尝试的第一件事就是在cts:element-word-query(xs:QName('appl:p'), "information from") and-query添加$p。但也要保留cts:contains表达式。这样,索引查找就可以检查任何appl:p元素中的“信息来源”,这应该会删除一些文档。那么cts:contains应该做的工作少了。如果内容结构允许,您可以通过用完整路径替换'// appl:block'步骤来帮助它。如果只有一个last-p,你也可以编写表达式,使它在找到第一个表达式后停止。

答案 2 :(得分:0)

您还可以在摄取时标记最后一个(例如,使其成为<appl:p last="true">...</appl:p>),以便您可以利用索引来避免where子句。