2012-08-06 68 views
1

我有以下查詢這樣的作品,但速度很慢,因爲我猜它的每一個文檔中尋找,而不是利用索引的: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:元素字 - 開啓了標點符號敏感選項​​,但我相信由於空間限制,我們沒有在數據庫中編制索引,所以它不起作用。

會愛我如何可能會加快這或改進任何建議。如果添加索引是我唯一的追求,我想我可以回到我們的管理員,看看有什麼可能,但希望我不必走這條路。

回答

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'步驟來幫助它。如果只有一個最後一個p,你也可以編寫表達式,以便它在找到第一個表達式後停止。

+0

謝謝,我會給這個鏡頭。 – zrdunlap 2012-08-07 14:42:23

+0

你對「未過濾」是正確的,事實證明這阻止了查詢的真正運行。謝謝您的幫助。 – zrdunlap 2012-08-07 20:40:03

1

我不認爲真的是一個包含單個元素的位置的索引。最好的解決辦法恐怕是將appl:p[position()=last()]複製元素並給它一個唯一的名稱,因此您可以使用cts:element-value-query直接到它。

如果where子句過濾掉大量的誤報,如果這些情況不包含帶有值appl:p「從信息:」在所有的,然後用cts:element-word-query可以有很大的幫助。

你不一定需要使用element-word-queries的索引。

HTH!

+0

謝謝,你是正確的索引,我的意思,大概沒有多少闡明在那裏似乎是在MarkLogic管理特定設置,使您可以打開或關閉索引標點和由於空間限制目前,我們已經完成了。如果我可以搜索「來自:」的信息(包括冒號),我會有更好的結果。儘管謝謝你的迴應! – zrdunlap 2012-08-07 13:25:46

+0

@zrdunlap索引沒有特定的標點符號設置。它的確有所作爲。如果您搜索'精確'匹配,單詞索引提供粗略結果,並且需要檢查/過濾以消除誤報。但是,這是自動完成的,它只是需要一點性能。 – grtjn 2012-08-07 14:04:01

+0

也許我們錯誤的軌道上,當你說搜索'確切'匹配,你是什麼意思?我試圖用cts來做到這一點:因爲在受控測試中,我可以確認使用cts:element-word-query(xs:QName(「appl:p」),「from:」的信息)來自「沒有冒號的信息」。 – zrdunlap 2012-08-07 14:39:04

0

你也可以旗攝取時間的最後一個(例如使它<appl:p last="true">...</appl:p>),這樣就可以利用索引,以避免在where子句。

+0

謝謝,是的,我們必須看到爲未來做這件事。 – zrdunlap 2012-08-07 20:39:09