Marklogic 8 Node.js API - 如何将搜索范围限定在根的 属性 child 上?

Marklogic 8 Node.js API - How can I scope a search on a property child of root?

[于 2009 年 28 月 17:15 更新]

我正在处理 json 类型的数据:

[
 {
 "id": 1,
 "title": "Sun",
 "seeAlso": [
    {
    "id": 2,
    "title": "Rain"
    },
    {
    "id": 3,
    "title": "Cloud"
    }
 ]
},
{
 "id": 2,
 "title": "Rain",
 "seeAlso": [
    {
    "id": 3,
    "title": "Cloud"
    }
 ]
},
{
 "id": 3,
 "title": "Cloud",
 "seeAlso": [
    {
    "id": 1,
    "title": "Sun"
    }
 ]
},
];

加入数据库后,node.js 搜索使用

db.documents.query(
 q.where(
  q.collection('test films'),
  q.value('title','Sun')
 ).withOptions({categories: 'none'})
)
.result( function(results) {
  console.log(JSON.stringify(results, null,2));
});

将 return 标题为 'Sun' 的电影和具有 seeAlso/title 属性 的电影(请原谅 xpath 语法)= 'Sun'.

我需要找到 1/ 电影标题 = 'Sun' 2/ 电影 seeAlso/title = 'Sun'。

我尝试使用 q.scope() 进行容器查询但没有成功;我找不到如何确定根 object 节点(第一种情况)的范围,对于第二种情况,

q.where(q.scope(q.property('seeAlso'), q.value('title','Sun')))

returns 作为第一个结果匹配根 object 节点内所有文本的项目

 {
    "index": 1,
    "uri": "/1.json",
    "path": "fn:doc(\"/1.json\")",
    "score": 137216,
    "confidence": 0.6202662,
    "fitness": 0.6701325,
    "href": "/v1/documents?uri=%2F1.json&database=Documents",
    "mimetype": "application/json",
    "format": "json",
    "matches": [
      {
        "path": "fn:doc(\"/1.json\")/object-node()",
        "match-text": [
          "Sun Rain Cloud"
        ]
      }
    ]
  },

这看起来很疯狂。

知道如何对非规范化 json 数据进行此类搜索吗?

劳伦特:

MarkLogic 支持 JSON 上的 XPath。

特别是,您可以考虑设置路径范围索引以匹配根目录中的 /title:

http://docs.marklogic.com/guide/admin/range_index#id_54948

Scoped 属性 匹配需要过滤或索引位置才能准确。另一种方法是在 /seeAlso/title

上设置另一个路径范围索引

对于匹配问题,了解 MarkLogic 版本并查看整个查询会很有用。

希望对您有所帮助,