我能得到一個更寬泛的版本而無需添加嵌套的領域是建立一個自定義的搜索選項,解析嵌套的JSON財產,並建立使用CTS搜索查詢:JSON-財產範圍查詢..
對於例如:讓我們假設你想尋找一些3級嵌套屬性
let $search := "(concept:orfs.aminoAcids.predictedMatureSeqs.domains.heavyChainIsoType:igg1)"
使用自定義分析器我能如果有人有興趣下面這個變換以下
<cts:json-property-scope-query xmlns:cts="http://marklogic.com/cts">
<cts:property>orfs</cts:property>
<cts:json-property-scope-query>
<cts:property>aminoAcids</cts:property>
<cts:json-property-scope-query>
<cts:property>predictedMatureSeqs</cts:property>
<cts:json-property-scope-query>
<cts:property>domains</cts:property>
<cts:json-property-scope-query>
<cts:property>heavyChainIsoType</cts:property>
<cts:word-query>
<cts:text xml:lang="en">igg1</cts:text>
<cts:option>case-insensitive</cts:option>
<cts:option>punctuation-insensitive</cts:option>
<cts:option>whitespace-insensitive</cts:option>
<cts:option>wildcarded</cts:option>
</cts:word-query>
</cts:json-property-scope-query>
</cts:json-property-scope-query>
</cts:json-property-scope-query>
</cts:json-property-scope-query>
</cts:json-property-scope-query>
是代碼自定義解析器
xquery version "1.0-ml";
module namespace gbrsso="http://marklogic.com/gbrs/modules";
import module namespace search = "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";
(:
This module tries to build a custom constraint.. and takes into account the nested query as well
for eg: Concept:registrar.username:mamidrx
:)
(: This is parse function which is invoked my marklogic when it sees the custom constraing :)
declare function gbrsso:parse($constraint-qtext as xs:string, $right as schema-element(cts:query)) as schema-element(cts:query){
let $log := xdmp:log("Constraint-qtext : " || $constraint-qtext)
let $log := xdmp:log("$right : " || fn:string($right//cts:text/text()))
let $queryText := fn:string($right//cts:text/text())
let $qparts := fn:tokenize($right//cts:text/text(), ":")
let $queryText := $qparts[last()]
let $log := xdmp:log("$queryText : " || $queryText)
let $qpartsCnt := fn:count($qparts)
let $query :=
if(fn:count($qparts) = 1) then
<root>{
cts:word-query($queryText, ("case-insensitive", "wildcarded", "punctuation-insensitive", "whitespace-insensitive"))
}</root>/*
else
<root>{
let $qparts := fn:tokenize($qparts[1],"\.")
let $endPart := $qparts[last()]
(: remove the last part in sequence as we need to create word query with it :)
let $qparts := fn:remove($qparts, fn:count($qparts))
let $queryExp :=
if(fn:count($qparts) = 0) then (: checks if it is nested... :)
cts:json-property-scope-query($endPart, cts:word-query($queryText, ("case-insensitive", "wildcarded", "punctuation-insensitive", "whitespace-insensitive")))
else
let $xy := cts:json-property-scope-query($endPart, cts:word-query($queryText, ("case-insensitive", "wildcarded", "punctuation-insensitive", "whitespace-insensitive")))
return gbrsso:buildQuery($xy, $qparts)
return $queryExp
}</root>/*
return $query
};
我能夠通過添加字段個別嵌套的葉子。對於如要解決嵌套問題:在我上面的情況下,我加入註冊商/用戶名作爲現場..所以我的代碼看起來像下面 ''' <約束名= 「用戶名」> <字段名= 「concept_registrar_username」/> 不區分大小寫的術語選項> 通配術語選項> ''' 但我想讓它足夠通用,所以我想創建所有葉節點的字段?任何方式使用約束容器達到 –
Ravi