MarkLogic - 在数组的每次出现中搜索
MarkLogic - Search within each occurrence of an array
MarkLogic 版本:9.0-6.2
我在 json 文档中有一个数组,如下所示。仅当电子邮件为 "test1@testmail.com" 并且该特定电子邮件的 EmailOverrideInd 为 "N" 时,我才需要 return 此文档。
"Contacts": [
{
"FirstName": "FTest1",
"LastName": "LTest1",
"Email": "test1@testmail.com",
"EmailOverrideInd": "Y"
},
{
"FirstName": "Ftest2",
"LastName": "Ltest2",
"Email": "test2@testmail.com",
"EmailOverrideInd": "N"
}
]
在上面给出的示例中,查询不应 return 文档,因为电子邮件 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']
)
如何将搜索限制在每个数组出现的范围内?
如果您可以指望结构看起来像您的示例,则可以使用 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']
)
要成功 运行 取消过滤,您需要打开 "word positions" 索引。
cts.nearQuery
的 1
参数意味着两个 propertyQuery 值需要出现在彼此的一个词内。请注意,我使用了 'ordered' 选项。在这种情况下,这可能不是必需的,但我发现有时当我知道数据结构的顺序时它很有用。
警告:我知道 XML 文档中的字数统计是如何工作的,但在 JSON 中并没有真正玩过那么多。您可能需要调整计数,但我认为此处 1 是正确的。
Dave 的好建议的一个替代方法是创建一个将数组项投影为行的 TDE 索引。
打开视图时指定片段 ID,使用当前查询进行约束,在列上过滤到感兴趣的电子邮件,如果需要其他文档信息,则加入文档(否则,只需使用行) .
代码的大致形状草图:
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
希望对您有所帮助,
MarkLogic 版本:9.0-6.2
我在 json 文档中有一个数组,如下所示。仅当电子邮件为 "test1@testmail.com" 并且该特定电子邮件的 EmailOverrideInd 为 "N" 时,我才需要 return 此文档。
"Contacts": [
{
"FirstName": "FTest1",
"LastName": "LTest1",
"Email": "test1@testmail.com",
"EmailOverrideInd": "Y"
},
{
"FirstName": "Ftest2",
"LastName": "Ltest2",
"Email": "test2@testmail.com",
"EmailOverrideInd": "N"
}
]
在上面给出的示例中,查询不应 return 文档,因为电子邮件 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']
)
如何将搜索限制在每个数组出现的范围内?
如果您可以指望结构看起来像您的示例,则可以使用 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']
)
要成功 运行 取消过滤,您需要打开 "word positions" 索引。
cts.nearQuery
的 1
参数意味着两个 propertyQuery 值需要出现在彼此的一个词内。请注意,我使用了 'ordered' 选项。在这种情况下,这可能不是必需的,但我发现有时当我知道数据结构的顺序时它很有用。
警告:我知道 XML 文档中的字数统计是如何工作的,但在 JSON 中并没有真正玩过那么多。您可能需要调整计数,但我认为此处 1 是正确的。
Dave 的好建议的一个替代方法是创建一个将数组项投影为行的 TDE 索引。
打开视图时指定片段 ID,使用当前查询进行约束,在列上过滤到感兴趣的电子邮件,如果需要其他文档信息,则加入文档(否则,只需使用行) .
代码的大致形状草图:
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
希望对您有所帮助,