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 版本并查看整个查询会很有用。
希望对您有所帮助,
[于 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 版本并查看整个查询会很有用。
希望对您有所帮助,