我能得到一个更宽泛的版本而无需添加嵌套的领域是建立一个自定义的搜索选项,解析嵌套的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