如何在 MarkLogic 中定义 xml 之间的关系并在搜索时使用它 API?

How to define relationship between xmls in MarkLogic and use it while search API?

这些是我插入数据库的文件。

<biblio>
    <biblioid>123</biblioid>
    <mediaid>456</mediaid>
    <name>dixit</name>
    <title>title</title>
</biblio>

<biblio>
    <biblioid>456</biblioid>
    <mediaid>789</mediaid>
    <name>singla</name>
    <title>title1</title>
</biblio>

<media>
    <mediaid>456</mediaid>
    <mediaName>media1</mediaName>
    <title>hello</title>
</media>

<media>
    <mediaid>789</mediaid>
    <mediaName>media1</mediaName>
    <title>hello</title>
</media>

<media>
    <mediaid>384</mediaid>
    <mediaName>media2</mediaName>
    <title>hello</title>
</media>

我想搜索那些在 <biblio> 中具有 <name> 的文档,如 "Dixit"<media> 中的 <medianame> ] 作为 "media1".

但它应该只检查那些具有 <mediaid> 的文档与 biblio/mediaid

中的相同

在我们的例子中,结果将是

<biblio>
    <biblioid>123</biblioid>
    <mediaid>456</mediaid>
    <name>dixit</name> <!-- name is matching ("dixit")-->
    <title>title</title>
</biblio>

<media>
    <mediaid>456</mediaid> <!-- mediaid is same as in biblio/mediaid  -->
    <mediaName>media1</mediaName> <!-- medianame is matching ("media1") -->
    <title>hello</title>
</media>

我可以做到这一点,首先获取所有与名称 ("dixit") 匹配的书目文档,然后从结果中提取 mediaid's(456),然后使用获取的 mediaid's( 456) 和媒体名称(media1).

但我想通过 search:search API.

来实现

有什么方法可以做到这一点吗?有什么地方可以定义 xml 元素之间的关系。

如果您在 media:id 上放置一个范围索引,那么您将能够进行一些 super-fast 连接。那是战斗的1/2。

另一半是:如果我想有问题地做这件事,我会通过 cts 和 xQuery 来做。

但是:如果我确实想将其作为 search:search 的一部分来执行此操作,我会使用自定义约束来执行此操作 - 然后自然地通过 search:search 库调用它们。

一个可能的自定义约束: biblio-by-media-name

  • 搜索具有相关名称的媒体
  • 将此解决为参考书目
  • return biblio 文档的 ct:document-query*

然后,如果我对名为 "biblio-name" 的 biblio-name 也有约束,那么我可以进行类似于以下示例的搜索 - 最后全部通过搜索 api 交付:

biblio-name:Dixit AND biblio-by-media-name:media1

* 请注意,document-query 是一种方法。但是,我可能不会将其构建在 biblio URI 上,而是可能会构建在 biblio 文件中 mediaid 元素上的 range-query 上。但这就是调整。结果与上面更简化的示例相同。

https://docs.marklogic.com/guide/search-dev/search-api#id_49750