2015-09-04 28 views
4

現在我正在使用此代碼生成片段,它基於我從MarkLogic搜索中獲得的JSON文檔。MarkLogic變音不敏感片段

xquery version "1.0-ml"; 
module namespace searchlib="http://ihs.com/lib/searchlib"; 
import module namespace search="http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy"; 
import module namespace json="http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy"; 

declare function searchlib:get-snippet($docc,$words) { 
    let $doc:= json:transform-from-json($docc) 
    let $squery := search:parse($words) 
    let $result := <result>{search:snippet($doc,$squery, 
    <transform-results apply="snippet" xmlns="http://marklogic.com/appservices/search"> 
      <max-snippet-chars>255</max-snippet-chars> 

     </transform-results>)}</result> 

    return $result//search:match 
}; 

進行搜索時我使用的是:

cts.jsonPropertyValueQuery(fieldname, values, 
              ['case-insensitive', 'diacritic-insensitive']) 

所以,搜索的工作變音不敏感,產生了良好的效果,但在search:snippet我不能夠通過diacritic-insensitive選項爲cts.jsonPropertyValueQuery

documentation我可以描述

選項來定義搜索語法和控制搜索看到這一點。有關功能搜索:搜索,請參閱$ options的說明。請注意,您無法使用search:snippet在transform-results選項中指定apply屬性。要使用不同的摘要功能,請改用搜索:搜索或搜索:解析。

但在這裏,它是:

search:snippet(
    $result as node(), 
    $cts-query as schema-element(cts:query), 
    [$options as element(search:transform-results)?] 
) as element(search:snippet) 

那麼是否意味着我無法通過其他選項進行搜索:片段?或者有這樣的選擇嗎?

我使用chávez測試它,它正在產生效果,但片段是包含精確匹配的文件只有正確生成,這意味着該文件

查韋斯做了

不會得到highligh上Chavez

查韋斯做了

將得到一個highligh

在此先感謝!

+0

我想你的意思是說' Chavez'不是結果的一部分。這可能是MarkLogic的一個錯誤,因爲它似乎與此功能所期望的相反。作爲一種解決方法,您可以考慮編寫一個添加突出顯示後處理的函數,儘管這樣做可能不是微不足道的(考慮使用NFD(分解),這可以消除搜索詞和結果中的變音符號,並且可以在內部進行搜索結果使用正常的XPath/XQuery函數)。 – Abel

+0

@Abel耶,這正是我的問題。我沒有在「查韋斯」上獲得重點。我擔心手動操作可能會降低性能,但也許我會嘗試製作一些解析文檔的函數。謝謝! – wudzik

+0

你應該考慮讓MarkLogic知道,如果它是一個錯誤,也許他們已經有一個解決方法,甚至補丁。 – Abel

回答

2

問題是不及格的選項search:snippet,但search:parse

xquery version "1.0-ml"; 
module namespace searchlib="http://ihs.com/lib/searchlib"; 
import module namespace search="http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy"; 
import module namespace json="http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy"; 

declare function searchlib:get-snippet($docc,$words) { 
    let $doc:= json:transform-from-json($docc) 
    let $squery := search:parse($words, 
<options xmlns="http://marklogic.com/appservices/search"> 
<term> 
<term-option>case-insensitive</term-option> 
<term-option>diacritic-insensitive</term-option> 
</term> 
</options>, "cts:query") 

    let $result := <result>{search:snippet($doc,$squery, 
    <transform-results apply="snippet" xmlns="http://marklogic.com/appservices/search"> 
      <max-snippet-chars>255</max-snippet-chars> 

     </transform-results>)}</result> 

    return $result//search:match 
}; 

傳遞

<term-option>diacritic-insensitive</term-option> 

search:parse使它工作。

下面是解釋從MarkLogic:

search:snippet()功能允許你提取匹配的文本和 返回封裝在包含節點的匹配項,用標記的亮點 。但是,要允許搜索:代碼段提取正確的 文本,傳遞給代碼段的cts:query()應與值序列 匹配。對於search:snippet,cts:query通常是search:parse的呼叫結果。 search:parse()函數根據給定的選項解析 查詢文本,並返回相應的XML文檔 cts:query XML。

+1

太棒了!複雜問題已解決:) – Abel