cts:word-query在json属性中搜索数字

时间:2017-09-01 19:26:04

标签: marklogic marklogic-8

我有一个json文件,它的属性有字符串值,有些属性有整数值。我有一个通用查询,它使用cts:word-query查询给定的json属性值。这在json属性具有字符串值时有效,但对于数值,它不起作用..例如:

以下是我的json字符串

{
    "id": "35A7D24661CFB8A7E050480A751E4949",
    "moniker": "CL-1460933",
    "entityType": "Cell Line",
    "entitySubType": "Immortalized",
    "bioSafetyLevel": "BL2",
    "name": "WSU-NHL",
    "growthFS": {
        "id": "35A7D24661D1B8A7E050480A751E4949",
        "mediumUsed": "IMDM + 10% HS",
        "percentCO2": 5,
        "percentHumudity": 95,
        "percentSerum": 10,
        "spinnerPlateSpeed": -1,
        "temp": -1,
        "growthConditions": "Suspension"
    },
}

当我执行以下操作时

cts:search(fn:doc(),
cts:json-property-scope-query("growthFS", cts:json-property-scope-query("percentHumudity", 
cts:word-query("95", ("wildcarded"), 1))))[1]

我没有得到json,但是当我做以下

cts:search(fn:doc(),
cts:json-property-scope-query("growthFS", cts:json-property-value-query("percentHumudity", 95, "wildcarded")))[1]

我收到了文档,我认为cts:word-query适用于任何xs:atomicType。如果不是这样,我怎么能写一个通用的cts:query而不考虑字符串的原子类型(字符串或数字)。

1 个答案:

答案 0 :(得分:1)

在XML中,一切都是字符数据,而且 - 没有XML Schema - 是不可区分的类型。因此,MarkLogic将所谓的通用索引中的所有XML值都包含为字符串值,因为它在索引时没有模式知识。在JSON布尔值中,数值具有显式类型,即使没有模式,也可以这样索引。 MarkLogic也做了相应的事情。

因此,您需要使用值查询来匹配JSON数字。您应该能够对单词和值查询执行OR查询以获得相同的值:

cts:search(
  fn:collection(),
  cts:json-property-scope-query("growthFS",
    cts:or-query((
      cts:json-property-word-query("percentHumudity", "95", "wildcarded"),
      cts:json-property-value-query("percentHumudity", 95, "wildcarded")
    ))
  )
)[1]

HTH!