Как я могу отсортировать cts-запрос, объединив значения в MarkLogi c? - PullRequest
2 голосов
/ 07 мая 2020

Когда я использую cts: search в XQuery, я могу довольно легко сортировать, обращаясь к элементам документа.

cts:search(
  fn:doc(), 
  cts:directory-query("/textdocuments/"), 
  cts:index-order(cts:element-reference(xs:QName("title")), "ascending")
)

Проблема в том, что значение, которое я хочу использовать для сортировки, содержится в другой документ и тот, который находится в найденном документе, является только ссылкой. Например, название нужно перевести, перевод хранится в отдельном документе, и я хочу отсортировать его после перевода. В SQL решением было бы выполнить внутреннее соединение, а затем выполнить сортировку после объединенного значения. Возможно ли подобное решение?

Я уже пробовал использовать часть Order в выражении FLWOR, и пока это работает, это не оптимально по производительности, так как требует загрузки всех документов, а я хочу загрузить только первые 20.

1 Ответ

1 голос
/ 07 мая 2020

Хорошо, у вас есть основной текстовый документ и отдельный документ с переводом заголовка. Как вы отметили, в реляционной базе данных общий подход состоит в том, чтобы другая таблица выполняла соединение. В MarkLogi c, вероятно, лучший подход - переместить переведенные заголовки в документы, на которые они ссылаются. MarkLogi c обычно оптимизирован для сортировки содержимого в целевых документах.

<doc>
  <title>My Title</title>
  <title-de>My Title in German</title-de>
  <title-fr>My Title in French</title-fr>
  <content>...</content>
</doc>

Я не вникаю в какие-либо специфические для языка c search / tokenization / et c здесь, просто объединяю данные, с которыми вы хотите работать.

Стоит отметить, что другим подходом является использование TDE и Opti c API. Вы можете создавать представления для своих основных документов и документов с переведенными заголовками, выполнять объединение и сортировать. Не зная подробностей, трудно сказать наверняка, но я ожидал, что первый подход будет лучше.

...