我使用marklogic的搜索功能来创建搜索页面.截至目前,我正在运行XQuery来获取搜索结果search:search.作为一个简单的例子,请参阅以下代码:
    xquery version "1.0-ml";
import module namespace search = "http://marklogic.com/appservices/search"
        at "/MarkLogic/appservices/search/search.xqy";
search:search('test',
     <options xmlns='http://marklogic.com/appservices/search'></options>)
此搜索搜索数据库中的所有内容,这在许多情况下都很好.在其他情况下,我基于集合进行搜索cts:collection-query.这些收藏品是我搜索的绝佳背景.
现在,我想根据"主"文档中的数据关系限制我的搜索结果.这个"主"文档具有对象模型中的所有关系.如果该对象模型具有对文档的引用,我希望该文档包含在搜索中.本质上,"主要"/模型文档是搜索的上下文.
我试图集体讨论一些最佳方法的想法.这是我到目前为止所提出的,但我希望有人更熟悉Marklogic(我只用了6个月)可以引导我朝着一个好方向前进:
cts:document-query(或类似)将它们添加到查询中.感谢您的任何意见或建议.
我有以下Marklogic查询,当在查询控制台中运行时,允许我检索具有管理员权限的系统用户:
xquery version "1.0-ml";
import schema namespace bfa="http://bitfood.org/auth" at "schema/auth/bitfood-auth.xsd";
cts:search(/bfa:AppUser[bfa:appAccess/@appRole = "ROLE_SYS_ADMIN"], cts:and-query(()))
请原谅我的无知,但是是否可以仅使用Java客户端API实现此查询?
我知道我可以通过XCC使用原始查询,但我尽量避免这种情况.
我一直在深入研究Java客户端API的文档,遗憾的是,这些文档简要介绍了其他搜索方法,并没有发现任何暗示这是可能的.
更新1:伙计们,我想我在这里打了一场比赛.
根据此问题,Java客户端API的查询选项构建工具被标记为已弃用.
@ehennum建议使用XML或JSON查询选项的替代方案.但是,此类查询选项规范仍然在代码中基本上定义为原始字符串:
String xmlOptions =
  "<search:options "+
        "xmlns:search='http://marklogic.com/appservices/search'>"+
      "<search:constraint name='industry'>"+
        "<search:value>"+
          "<search:element name='industry' ns=''/>"+
        "</search:value>"+
      "</search:constraint>"+
  "</search:options>";
当然,我可以使用JAXB,JDOM,文件或其他工具来创建XML,但我的个人意见是我们仍然依赖于在代码中的资源文件中存储查询,这本身并不是坏事,但没有仔细考虑可能导致代码维护噩梦.
此外,这些选项需要通过服务器上的REST持久化这一事实引入了另外一层潜在问题,以防这是必需的,因为选项可能需要与每个用于代码库的数据库实例同步.
因此,如果Marklogic开发人员正在监听,我认为Java客户端API并不像我预期的那样成熟或记录.
到目前为止我有两个选择:
1)我可以在String文件中对我的XCC查询进行硬编码,并尝试使用参数占位符来插入我需要的数据并通过XCC会话检索.要么.
2)查看http://marklogic.com/appservices/search命名空间是否有任何XSD文件,并从中创建静态JAXB对象,以便构建某种"标准"类,Hibernate或QueryDSL,遗憾的是,我必须说,它已经支持某种级别的MongoDB查询.
伙计们,真的,带来一些流利的查询设施,如QueryDSL到Marklogic,并摆脱这个Rube Goldberg查询机器.
更新2:似乎可以在ML7中解决这个问题.期待它.
谢谢!
在MarkLogic中,是否可以将cts:search表达式绑定到变量,然后在XQuery中的其他位置使用该变量?
我想做这样的事情:
let $query := cts:search(doc(),
                               cts:and-query((
                                  cts:element-attribute-word-query(
                                    xs:QName("para"),
                                    xs:QName("role"),
                                      "intro") ,
                                  cts:element-attribute-word-query(
                                    xs:QName("title"),
                                    xs:QName("role"),
                                      "inline")
                                       ))
                                     )
let $number-of-results := xdmp:estimate($query)
return $number of results
但是,我不确定如何传递表达本身,而不是它返回的内容.
我正在尝试在Native JSON属性上添加范围索引,该属性在MarkLogic Server中的名称中包含冒号(:).
样本数据如下.
{
  "Aspects": {
"xbrl28:TransactionTime": "2014-08-13T00:00:00+0000",
"xbrl28:Archive": "S1002U7K",
"xbrl:Period": "2014-08-13"
  },
  "_id": "27948e6d-a774-49ee-8e30-668cc4731975"
}
当我尝试在"xbrl28:Archive"上添加范围索引时,但我不能,因为"xbrl28:"被视为命名空间的前缀.有没有办法逃脱结肠?
我正在尝试构建一个角度应用程序来访问MarkLogic数据库中的数据.我正在使用MarkLogic rest API来访问数据.当我尝试运行该应用程序时,出现以下错误.
XMLHttpRequest无法加载 http://192.168.192.75:9550/v1/keyvalue?element=fieldId&value=1005&format=json.请求的资源上不存在"Access-Control-Allow-Origin"标头.因此,不允许来源" http:// localhost:8080 "访问.
我已经在stackoverflow上阅读了很多与此问题相关的答案,但无法正常工作.这是我到现在为止所尝试的.
1) Setting the response header using xdmp in qconsole
xdmp:add-response-header("Access-Control-Allow-Origin", "*");
xdmp:add-response-header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
xdmp:add-response-header("Access-Control-Allow-Headers", "x-requested-with, X-Auth-Token, Content-Type");
2) Tried to add headers by using REST [Extention][1]. Here is the example.sjs file which I wrote.
a) function get(context, params) {
  var results = [];
  context.outputTypes = [];
  for (var pname in params) {
    if (params.hasOwnProperty(pname)) {
      results.push({name: pname, value: params[pname]});
      context.outputTypes.push('application/json');
    }
  }
  context.outputStatus = [201, 'Created My …您好我如何检索目录中的所有文档的URI.我创建了下面的xquery来实现它,但这没有帮助.
for $i in xdmp:directory("/Test/performance/results/","infinity")
let $k := document-uri(fn:doc($i))
return <li>{$k}</li>
在marklogic中,三元组可以嵌入到现有文档中.我如何使用cts搜索查询来返回文档.文档的一个例子可以是
<ContentVersion>
  <Name>Testing</Name>
  <Status>Approved</Status>
  <sem:triples xmlns:sem="http://marklogic.com/semantics">
   <sem:triple>
      <sem:subject>http://mycontent/content/Testing</sem:subject>
      <sem:predicate>is</sem:predicate>
      <sem:object>Approved</sem:object>
 </sem:triple>
</sem:triples>
</ContentVersion>
如果尝试以下查询
let $query := cts:word-query('Testing',"case-insensitive")
let $sparql := "PREFIX cts: <http://marklogic.com/cts#>
                DESCRIBE ?s 
                WHERE{ 
                   ?s ?p ?o .
                   FILTER cts:contains(?o, cts:word-query('Testing')) 
                }"
let $results := sem:sparql($sparql,(),("default-graph=magician"),($query))  
return(sem:rdf-serialize($results,'rdfxml'))
我得到一个空洞的结果.关于为什么没有归还的任何想法?我正在使用MarkLogic 7
我正在调用sec:role-exists().我试图找出将此功能授予管理员以外的其他人所需的权限.我得到的错误意味着我需要http://marklogic.com/xdmp/privileges/get-role权限.
SEC-PRIVDNE: xdmp:security-assert("http://marklogic.com/xdmp/privileges/get-role", "execute") -- Privilege does not exist: action(http://marklogic.com/xdmp/privileges/get-role), kind(execute)
但是,当我尝试通过sec:privilege-add-roles使用admin帐户授予此角色时,它告诉我该权限不存在.
[1.0-ml] SEC-PRIVDNE: (err:FOER0000) Privilege does not exist: action(http://marklogic.com/xdmp/privileges/get-role), kind(execute)
有任何想法吗?
这是我用来授权的代码片段,我以管理员身份运行.
(: grant the needed privileges to the role :)
let $grant_privs :=
xdmp:invoke-function(
  function() {
    let $required_roles := (
      "http://marklogic.com/xdmp/privileges/create-role",
      "http://marklogic.com/xdmp/privileges/remove-role",
      "http://marklogic.com/xdmp/privileges/get-role-ids",
      "http://marklogic.com/xdmp/privileges/get-role-names",
      "http://marklogic.com/xdmp/privileges/get-role",
      "http://marklogic.com/xdmp/privileges/xdmp-invoke-in",
      "http://marklogic.com/xdmp/privileges/xdmp-invoke"
    )
    return
      for $r in $required_roles
        return
          sec:privilege-add-roles(
            $r,
            "execute",
            "auth-lib"
          )
  },
  <options xmlns="xdmp:eval">
    <database>{ xdmp:security-database() }</database>
    <transaction-mode>update-auto-commit</transaction-mode>
    <isolation>different-transaction</isolation>
  </options>
)
我有一个MarkLogic 8数据库,其中有两个日期时间字段的文档:
created-onactive-since我试图写一个XQuery搜索所有的文件对于其值active-since 小于价值created-on
目前我正在使用以下FLWOR表达:
    for $entity in fn:collection("entities")
    let $id := fn:data($entity//id)
    let $created-on := fn:data($entity//created-on)
    let $active-since := fn:data($entity//active-since)
    where $active-since < $created-on
    return 
      (
        $id,
        $created-on,
        $active-since
      )
上述查询执行时间过长,并且随着文档数量的增加,此查询的执行时间也将增加.
此外,我有 
 element-range-index两个上面提到的dateTime字段,但它们没有在这里使用.所述CTS-元件查询函数只有一个元素与一组原子值进行比较.在我的情况下,我试图比较同一文件的两个元素.
我认为应该有一个更好和优化的解决方案来解决这个问题.
如果有任何搜索功能或任何其他适合此方案的方法,请通知我.
我正在尝试从文件系统中获取JSON文件,并尝试将文件插入MarkLogic数据库.
<route id="file_upload">
  <!-- incoming requests from the file is routed -->
  <from uri="file:/E:/camel/input"/>
  <to uri="http://localhost:8005/v1/documents?uri/patents/test.json"/>
</route>
用户名和密码为:admin/admin,用于在8005上运行的MarkLogic REST实例
marklogic ×10
xquery ×4
marklogic-8 ×3
marklogic-7 ×2
search ×2
apache-camel ×1
cors ×1
cts-search ×1
java ×1
json ×1
rest ×1
spring-dsl ×1
xpath ×1