1

这些是我在数据库中插入的文档。

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

我想搜索那些具有" Dixit"和" media1 "<name>的文档。<biblio><medianame><media>

但它应该只检查那些<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”)匹配的所有 biblio 文档,然后从结果中提取 mediaid(456),然后使用获取的 mediaid(456)和 medianame(media1)查询媒体文档.

但我想通过 search:search API 来实现这一点。

有什么办法可以做到这一点,有没有什么地方可以定义xmls元素之间的关系。

4

1 回答 1

4

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

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

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

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

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

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

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

* 请注意,文档查询是一种方法。但是,我可能不会在 biblio URI 上构建它,而是在 biblio 文件中 mediaid 元素的范围查询上构建它。但这都是关于调整的。在上面更简化的示例中,结果将相同。

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

于 2017-02-13T09:15:20.710 回答