Как определить связь между xmls в MarkLogic и использовать ее при поиске 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>

Я хочу искать эти документы, имеющие <name> в <biblio> как "Диксит" и <medianame> в <media> как "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 (456), а затем запросю медиа документы с извлеченными mediaid (456) и medianame(media1).,

Но я хочу добиться этого с помощью поиска: поиск API.

Есть ли способ сделать это и есть ли место, где я могу определить отношения между элементами xmls.

1 ответ

Решение

Если вы поместите индекс диапазона на media:id, вы сможете сделать несколько сверхбыстрых объединений. Это половина битвы.

Другая половина: если бы я хотел сделать это проблематично, я бы сделал это с помощью cts и xQuery.

НО: если бы я хотел сделать это как часть search:search, я бы сделал это с пользовательскими ограничениями, а затем вызвал бы их через библиотеку search: search.

Возможное пользовательское ограничение: biblio-by-media-name

  • поиск медиа с указанным именем
  • решить это в библиографии
  • вернуть ct:document-query* из библиографических документов

Тогда, если бы у меня также было ограничение на biblio-name, называемое "biblio-name", тогда я мог бы выполнить поиск, подобный приведенному ниже примеру, и все было доставлено через API поиска в конце:

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

* Обратите внимание, что документ-запрос является одним из подходов. Тем не менее, я мог бы построить это не на URI библиотеки, а на запросе диапазона к элементу mediaid в файлах библиотеки. Но это все о тюнинге. Результаты будут такими же, как в более упрощенном примере выше.

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

Другие вопросы по тегам