1

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

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 并打开标点符号敏感选项​​,但我相信由于空间限制,我们没有在数据库中索引它,所以它不起作用。

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

4

3 回答 3

1

我不认为真的有一个包含单个元素位置的索引。恐怕最好的解决方案是复制appl:p[position()=last()]元素并给它一个唯一的名称,这样你就可以cts:element-value-query直接使用它。

如果 where 子句过滤掉了很多误报,并且如果这些案例根本不包含appl:p值为 'information from:' 的 a,那么使用 acts:element-word-query可能会有很大帮助。

您不一定需要使用索引element-word-queries

于 2012-08-06T17:31:52.207 回答
0

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

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

于 2012-08-07T14:17:25.370 回答
0

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

于 2012-08-07T18:45:08.540 回答