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

时间:2017-02-13 05:44:45

标签: marklogic marklogic-8 marklogic-7

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

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

我想在<name>中将<biblio><medianame>的文件作为&#34; Dixit&#34; <media> <mediaid>搜索为的&#34; Media1中&#34;

但它应该只检查那些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>

相同的文件

与我们的情况一样,结果将是

s

我可以实现这一点,首先让所有与名称匹配的biblio文档(&#34; dixit&#34;)然后从结果中我将提取媒体代码(456),然后查询媒体具有获取的mediaid的文档(456)和中间名(media1)。

但我希望通过搜索来实现这一目标:搜索API。

有没有办法让这种情况发生,是否有任何地方可以定义xmls元素之间的关系。

1 个答案:

答案 0 :(得分:4)

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

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

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

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

  • 搜索有问题名称的媒体
  • 将此解析为biblio references
  • 返回biblio docs的文档查询*

然后,如果我对biblio-name也有一个约束,名为&#34; biblio-name&#34;然后我可以搜索类似下面的例子 - 最后通过搜索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