【问题标题】:Extracting only portion of JSON document with REST API search call in MarkLogic在 MarkLogic 中使用 REST API 搜索调用仅提取 JSON 文档的一部分
【发布时间】:2018-09-13 08:18:10
【问题描述】:

我正在寻找使用 JavaScript 或 XQuery 在 MarkLogic 中通过 REST API 搜索调用仅提取部分 JSON 文档的方法。 我曾尝试使用 re extract-document-data 的查询选项,但没有成功。尝试使用 CTS.validextract 路径检查我的提取路径,但在 Marklogic 9.0-1 中无法识别该功能

我是否必须使用特定的搜索选项,例如约束或结构化查询。 你能帮忙吗? TIA。

我有下面这样的示例文档

{
"GenreType": {
    "Name": "GenreType",
    "LongName": "Genre Complex",
    "AttributeDataType": "String",
    "GenreType Instance Record": [
      {
        "Name": "GenreType Instance Record",
        "Action": "NoChange",
        "TitleGenre": [
          "Test1"
        ],
        "GenreL": [
         "Test1"
        ],
        "GenreSource": [
          "ABC"
        ],
        "GenreT": [
          "Test1"
        ]
      },
      {
        "Name": "GenreType Instance Record",
        "Action": "NoChange",
        "TitleGenre": [
          "Test2"
        ],
        "GenreL": [
          "Test2"
        ],
        "GenreSource": [
          "PQR"
        ],
        "GenreT": [
          "Test2"
        ]
      }
     ]

    }
}   

我需要在 GenreType 复杂属性中搜索具有属性“TitleGenre”WHERE GenreSource =“ABC”的文档。是json文档中的一个数组。

我使用的搜索选项如下,(在 XML 中编写搜索选项,但在 json 文档中搜索)

  <extract-path>/GenreType/"GenreType Instance Record"[@GenreSource="ABC"]</extract-path>

我仍然面临这些问题。如果可能的话,您能否让我知道如何搜索 json 文档来满足此类特定要求? @瓦格纳迈克尔

【问题讨论】:

  • 您能否编辑您的问题以共享查询选项,尤其是提取文档数据部分?还有你用来验证路径的代码 sn-p?
  • 当然我补充。我正在旅行,所以代码 sn-p 不方便。
  • cts.validExtractPath 是在 MarkLogic 9.0-4 中引入的。如果您使用的是旧版本的 MarkLogic,则 cts.validIndexPath 是适当的路径检查器。

标签: javascript search xquery marklogic


【解决方案1】:

您可以使用extract-document-dataoption提取文档数据。

xquery version "1.0-ml";
let $doc := object-node {
"GenreType": object-node {
    "Name": "GenreType",
    "LongName": "Genre Complex",
    "AttributeDataType": "String",
    "GenreType-Instance-Record": array-node {
      object-node {
        "TitleGenre": array-node {
          "Test1"
        },
        "GenreSource": array-node {
          "ABC"
        }
      },
      object-node {
        "TitleGenre": array-node {
          "Test2"
        },
        "GenreSource": array-node {
          "PQR"
        }
      }}
    }
}   
return xdmp:document-insert("test.xml", $doc);

import module namespace search = "http://marklogic.com/appservices/search"
    at "/MarkLogic/appservices/search/search.xqy";

search:search(
  "Genre Complex",
  <options xmlns="http://marklogic.com/appservices/search">
    <extract-document-data>
      <extract-path>/GenreType/GenreType-Instance-Record[GenreSource = "ABC"]</extract-path>
    </extract-document-data>
  </options>
)

在这种情况下,/GenreType/GenreType-Instance-Record 是提取元素的 xpath。 关于您的评论,我还添加了一个谓词[GenreSource = "ABC"]。这样,只有GenreSource 为“ABC”的GenreType-Instance-Record 被提取!

结果:

....
<search:extracted kind="array">[{"GenreType-Instance-Record":{"TitleGenre":["Test1"], "GenreSource":["ABC"]}}]
</search:extracted>
....

注意

  • 您可以添加多个&lt;search:extract-path&gt; 元素!
  • 我不得不将GenreType Instance Record 的名称更改为GenreType-Instance-Record。我不确定您是否可以使用带有空格的属性名称并使用 xpath 访问它们。我无法让它以这种方式工作。

如果这不适合您,请发布您的搜索选项。

编辑:向提取路径添加谓词。

【讨论】:

  • 感谢您的快速回复。我正在尝试这个。我肯定会在这里更新。
  • 如何在以下示例中仅检索具有过滤提取路径的文档我需要仅具有 "Source" = "ABC" 的文档,因此在提取的节点中它应该只返回那些实例。{ "Type “:{“名称”:“类型”,“类型实例:[{“Id”:“4022”,“标题”:[“AAA”],“来源”:[“ABC”],“领土”:[ "100" ] } ] } }
  • 如何使用带有谓词/ where 子句条件的提取路径,例如 /Type[Source = "ABC"],有什么方法或解决方案到这种场景? @瓦格纳迈克尔
  • 是的,这是可能的!我编辑了我的答案并在我的示例中添加了一个谓词!
  • 另请注意,extract-path 不支持完整的 xquery 语法。有关详细信息,请参阅以下链接:docs.marklogic.com/guide/xquery/xpath#id_32278
【解决方案2】:

非常感谢瓦格纳,感谢您的及时试用。截至目前,帮助我寻找解决问题的准确方法。我使用了下面的提取路径,因为我无法修改文档中的名称。 /GenreType/array-node("GenreType Instance Record")/object-node()/TitleGenre[following-sibling::GenreSource="ABC"]

【讨论】:

  • 使用我以前使用的方式会是一个好习惯吗?请问有cmets吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多