2017-02-13 43 views
1

這些是我在數據庫中插入的文檔。如何定義MarkLogic中xml的關係並在搜索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><media>以搜索<name>這些文件爲「迪克西特」<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> 

我能做到這一點,首先讓所有的文獻記錄docs匹配名稱(「dixit」),然後從結果中提取mediaid(456),然後使用提取的mediaid(456)和medianame(media1)查詢媒體文檔。

但我想通過搜索:搜索API來實現這一點。

有什麼辦法可以做到這一點嗎?有沒有什麼地方可以定義xml元素之間的關係。

+0

我不認爲你只用一個'search:seach'調用就可以做到這一點。爲什麼要在一個查詢中混合文檔和媒體?我只能想象你可能想要出口的目的.. – grtjn

回答

4

如果您在媒體:id上放置了一個範圍索引,那麼您將能夠進行一些超快速連接。這是1/2的戰鬥。

另一半是:如果我想這樣做有問題,我會通過cts和xQuery來做到這一點。

但是:如果我確實希望將其作爲search:search的一部分來執行,那麼我會使用自定義約束來完成此操作 - 然後通過search:search庫自然地調用它們。

一個可能的定製約束: 文獻記錄,通過媒體名稱

  • 搜索問題
  • 解決此的文獻記錄引用
  • 回報克拉名爲媒體:文檔查詢該文獻記錄文檔的

那麼,如果我還對所謂的「文獻記錄名稱」的文獻記錄,名稱的約束*然後我可以有一個搜索類似下面的例子 - 所有最後通過搜索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

+0

感謝大衛您的寶貴答案。 只是爲了知識,我想知道你將如何使用cts和xQuery來做到這一點。 –

+0

不客氣。對於cts/xQuery - 您將基本上使用用於自定義約束的相同函數。一起移除搜索層。這有道理嗎? –

相關問題