2011-05-01 37 views
0

我寫了一個基本的XQuery,需要一個參數,執行「包含」上的數據參數和返回相關的數據集。的Xquery搜索

let $search_term:= request:get-parameter("param1",0) 
return 
    <root> { 
    for $node in doc('http://localhost:8080/data/doc.xml')/root/node 
     for $value in $node/element/value 
     where contains((upper-case($value)), (upper-case($search_term))) 
     order by $node/title 
     return $node 
    } <root> 

我該如何去擴展它來搜索多個參數。在我的Java應用程序中,用戶在編輯框中輸入搜索字符串。因此搜索字符串可能包含很多單詞。目前,該代碼僅允許在搜索字符串上搜索整個短語。

是否可以解析所有的話在「參數1」到XQuery中的字符串序列,然後執行包含-任何-對這個序列。最後,擴展後,我可以通過匹配數量來排列結果。

謝謝。

+1

對於全文搜索,你應該考慮[XQuery和XPath全文1.0](http://www.w3.org/TR/xpath-full-text-10/) – 2011-05-04 00:16:50

回答

0

你必須寫無論是在Java或XQuery搜索解析器來做到這一點。 如果它是一個數據庫的Xquery像MarkLogic或存在-DBü可以leverge他們的搜索API和索引。比賽:如果你想在單個節點文本的簡單搜索,那麼你可以改變用戶輸入一個正則表達式,並使用Fn

。儘管如此,請注意XQuery注入。

看您的代碼段我想建議一兩件事。請儘可能考慮使用Xpath,而不是用於性能消耗的循環。

+0

「請儘量使用Xpath而不是性能消耗的循環。「在某些情況下,可能會有一些XQuery處理器,但我無法想象這通常是正確的。你能舉出這個斷言的任何證據嗎? – 2011-05-01 19:24:30

+0

根據我的經驗XPath解析器在內部通過XML/XPATH/XSLT/XQUERY數據庫/引擎的視角比用戶提要XQuery更加強大和可緩存 - 用於帶謂詞和條件的循環。更進一步,如果一個具有強大XML數據庫的環境具有XQuery/xPATH引擎,那麼我會說利用數據庫的某些方面。當我們查詢大量的Xml clob時,嘗試按照數據庫特定的Xml節點索引 - > Xpath - >用戶爲循環定義的順序(where/orderby/groupby)|方法分支會給你更好的結果。 – kadalamittai 2011-05-02 14:24:31

+0

我懷疑你的經驗與某一特定產品有關,而你錯誤地認爲它可以外推到其他產品。 – 2011-05-17 12:20:25

0

你當然可以這樣做的

where some $v in tokenize($value, '\s'), $k in tokenize($search_term, '\s') 
satisfies upper-case($v) = upper-case($k) 

但是更換

where contains((upper-case($value)), (upper-case($search_term))) 

,我擔心結果可能令人失望的習慣了智能自由文本用戶從谷歌搜索引擎可用。而不是建立自己的粗體自由文本搜索,最好是使用能夠正確執行工作的內容。