MarkLogic版本:9.0-6.2
我在json文档中有一个数组,如下所示。我的需要是仅在该电子邮件为“ test1@testmail.com”且该电子邮件的EmailOverrideInd为“ N”的情况下才返回此文档。
"Contacts": [
{
"FirstName": "FTest1",
"LastName": "LTest1",
"Email": "test1@testmail.com",
"EmailOverrideInd": "Y"
},
{
"FirstName": "Ftest2",
"LastName": "Ltest2",
"Email": "test2@testmail.com",
"EmailOverrideInd": "N"
}
]
在上面的示例中,查询不应该返回文档,因为电子邮件test1@testmail.com的EmailOverrideInd为“ N”
使用常规的cts.jsonPropertyValueQuery和cts.andQuery,我仍然可以获取文档,因为我的搜索并没有将范围限制为每个数组出现的地方。
cts.search(
cts.andQuery(
[
cts.collectionQuery('testcol'),
cts.jsonPropertyValueQuery('Email', EmailAddr, ['exact']),
cts.jsonPropertyValueQuery('EmailOverrideInd', 'N', ['exact'])
]
),
['unfiltered','score-zero']
)
如何将搜索范围限制为每个数组出现?
答案 0 :(得分:2)
如果您可以依靠示例中的结构,则可以使用cts.nearQuery
。
let emailAddr = "test1@testmail.com";
cts.search(
cts.andQuery(
[
cts.collectionQuery('testcol'),
cts.nearQuery(
[
cts.jsonPropertyValueQuery('Email', EmailAddr, ['exact']),
cts.jsonPropertyValueQuery('EmailOverrideInd', 'N', ['exact'])
],
1,
'ordered'
),
]
),
['unfiltered', 'score-zero']
)
为此,要成功运行未经过滤,您需要打开“单词位置”索引。
1
的{{1}}参数意味着两个propertyQuery值需要出现在一个单词之内。请注意,我使用了“ ordered”选项。在这种情况下,这可能不是必需的,但是当我知道数据结构的顺序时,有时会发现它很有用。
注意事项:我了解XML文档中单词计数的工作原理,但是在JSON中并没有真正发挥作用。您可能需要调整计数,但是我认为这里1是正确的。
答案 1 :(得分:1)
Dave的一个很好的建议是创建一个TDE索引,将数组项投影为行。
在打开视图时指定片段ID,使用当前查询进行约束,在列上过滤到感兴趣的电子邮件,然后在需要其他文档信息时加入文档(否则,仅使用行)。 / p>
代码一般形状的草图:
const docId = op.fragmentIdCol('docId');
const results = op.fromView(yourEmailsSchema, yourEmailsView, '', docId)
.where(... your existing cts.query to narrow the candidates ...)
.where(... boolean expression against the columns to get the exact ...)
.joinDoc('doc', docId)
.select('doc')
.result();
另请参阅:
http://docs.marklogic.com/guide/app-dev/TDE
和
http://docs.marklogic.com/op.fromView
希望有帮助,