簡體   English   中英

在 Marklogic 中使用 XQuery 無法理解 CTS 查詢

[英]Trouble understanding CTS queries using XQuery in Marklogic

我正在嘗試使用cts:search()了解cts:element-querycts:element-value-querycts:element-word-query之間的區別。

當有人可以使用所有三個實現相同的事情時,他們為什么要創建這么多?

我確定我在這里遺漏了一些需要理解的東西。 我有以下數據:

<CATALOG>
  <CD>
    <TITLE>Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>Columbia</COMPANY>
    <PRICE>10.90</PRICE>
    <YEAR>1985</YEAR>
  </CD>
  <CD>
    <TITLE>Hide your heart</TITLE>
    <ARTIST>Bonnie Tyler</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>CBS Records</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1988</YEAR>
  </CD>
  <CD>
    <TITLE>Greatest Hits</TITLE>
    <ARTIST>Dolly Parton</ARTIST>
    <COUNTRY>EU</COUNTRY>
    <COMPANY>RCA</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1982</YEAR>
  </CD>
</CATALOG>

我想過濾國家的數據說“歐盟”。 我可以使用下面列出的任何查詢來實現相同的目標。

  •  cts:search(//CD,cts:element-query(xs:QName("COUNTRY"),"EU"))
  •  cts:search(//CD,cts:element-value-query(xs:QName("COUNTRY"),"EU"))
  •  cts:search(//CD,cts:element-word-query(xs:QName("COUNTRY"),"EU"))

那么區別是什么呢? 什么時候用什么? 有人可以幫我理解嗎?

我的理解是使用cts:searchcts:element-query 如果我也可以使用其他查詢獲得相同的結果,我正在研究其他查詢。 (我已經瀏覽了我仍然不明白的文檔)。 有人可以給我一個簡單的解釋嗎?

這三個 cts:element-* 查詢函數具有一些重疊的功能,並且可以獲得相同的結果,但有一些關鍵差異會影響查詢的可能性以及查詢對您的系統的效率。

  • cts:element-query()是一個容器查詢。 它匹配第一個參數中指定的元素。 第二個參數的查詢應用於匹配的元素及其所有后代 因此,如果有更復雜的結構, cts:word-query將匹配 COUNTRY 或任何后代元素的文本。

    使用xdmp:plan()查看查詢計划,

     xdmp:plan(cts:search(//CD,cts:element-query(xs:QName("COUNTRY"),"EU")))

    您可以看到該計划具有應用不受約束的單詞查詢的條件:

     <qry:term-query weight="1"> <qry:key>17785254954065741518</qry:key> <qry:annotation>word("EU")</qry:annotation> </qry:term-query>
  • cts:element-value-query()僅匹配文本內容與第二個參數中的短語匹配的簡單元素(即僅包含文本且沒有子元素的元素)。

    該查詢的xdmp:plan()

     xdmp:plan( cts:search(//CD,cts:element-value-query(xs:QName("COUNTRY"),"EU")) )

    表明有一個值專門應用於COUNTRY元素:

     <qry:term-query weight="1"> <qry:key>9358511946618902997</qry:key> <qry:annotation>element(COUNTRY,value("EU"))</qry:annotation> </qry:term-query>
  • cts:element-word-query()類似於 cts:element-value-query,除了它只搜索指定元素的直接文本節點子節點以及管理界面中定義的子元素的任何文本節點子節點element-word-query-throughs 或 phrase-throughs 它不會搜索指定元素的任何其他子元素。

    該查詢的xdmp:plan()

     xdmp:plan( cts:search(//CD,cts:element-word-query(xs:QName("COUNTRY"),"EU")) )

    表明有一個詞查詢專門應用於COUNTRY元素:

     <qry:term-query weight="1"> <qry:key>6958980695756965065</qry:key> <qry:annotation>element(COUNTRY,word("EU"))</qry:annotation> </qry:term-query>

    如果您有混合內容和特定元素的已知詞匯表,並且希望在搜索時能夠“看穿”,那么cts:element-word-query最有幫助。 一個示例是 MS Word 或 XHTML 標記,其中包含用於應用樣式和格式的元素包裝文本,例如<p>內的<b><i><u> > 並且您想要搜索給定段落中的單詞並搜索biu子元素。

對於這個特定實例,要在特定元素中搜索值,您應該使用:

cts:search(//CD,cts:element-value-query(xs:QName("COUNTRY"),"EU")) 

這是告訴 MarkLogic 您要在COUNTRY元素(而不是它的任何子元素或后代)中搜索值“EU”的最具體和最有效的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM