1

[28/09 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));
});

将返回名为“Sun”的电影和具有 seeAlso/title 属性的电影(请原谅 xpath 语法)=“Sun”。

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

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

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

作为第一个结果返回与根对象节点内的所有文本匹配的项目

 {
    "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 数据进行此类搜索的任何想法?

4

1 回答 1

2

劳伦特:

MarkLogic 支持 JSON 上的 XPath。

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

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

范围属性匹配需要过滤或索引位置才能准确。另一种方法是在 /seeAlso/title 上设置另一个路径范围索引

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

希望有帮助,

于 2015-08-28T13:23:04.550 回答