如何在 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
这些是我插入数据库的文件。
<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