我如何通过在 MarkLogic 中加入值来对 cts 查询进行排序?

How can i sort a cts query by joining values in MarkLogic?

当我在 XQuery 中使用 cts:search 时,我可以很容易地通过访问文档的元素进行排序。

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

问题是我要用于排序的值包含在另一个文档中,而找到的文档中的值仅供参考。 例如。标题必须翻译,翻译存储在一个单独的文档中,我想在翻译后进行排序。 在 SQL 中,解决方案是执行内部联接,然后在联接值之后排序。 是否有类似的解决方案?

我已经尝试使用 FLWOR 表达式的 Order 部分,虽然它正在运行,但它的性能并不是最佳的,因为它需要加载所有文档,而我只想加载前 20 个。

好的,现在您有了主要的文本文档和一个包含标题翻译的单独文档。正如您所指出的,在关系数据库中,常见的方法是让另一个 table 进行连接。在 MarkLogic 中,可能最好的方法是将这些翻译的标题移动到它们作为参考的文档中。 MarkLogic 通常针对目标文档中的内容进行了优化。

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

我在这里不涉及任何 language-specific search/tokenization/etc,只是将您要使用的数据汇集在一起​​。

值得注意的是,另一种方法是使用 TDE 和 Optic API。您可以在您的主要文档和带有翻译标题的文档上创建一个视图,进行连接和排序。在不知道细节的情况下,很难肯定地说,但我希望第一种方法会更好。