MarkLogic-在每次出现的数组中搜索

时间:2019-02-26 16:43:37

标签: marklogic marklogic-9

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']
)

如何将搜索范围限制为每个数组出现?

2 个答案:

答案 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

希望有帮助,