我有以下查询可行,但速度非常慢,因为我猜它必须查看每个文档而不是使用索引:
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并打开了标点符号敏感选项,但我认为由于空间限制我们没有在数据库中对其进行索引,所以它不起作用。
我会喜欢任何关于如何加速或改进它的建议。如果添加索引是我唯一的办法,我想我可以回到我们的管理员,看看有什么可能,但希望我不必走那条路。
答案 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子句。