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.nearQuery1 参数意味着两个 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

希望对您有所帮助,