gpt4 book ai didi

Jackrabbit 跨连接节点搜索

转载 作者:行者123 更新时间:2023-12-04 16:00:33 28 4
gpt4 key购买 nike

我在 Jackrabbit 存储库中标记了对象(实际上是 Adob​​e/Day CQ 的 CRX,但我认为这是 Jackrabbit 代码):

  • Assets :标签 = A、B
  • 子 Assets 数据 1:标签 = A、C、E
  • 子 Assets 数据 2:标签 = D、E

  • 我想查询父 Assets 的标签集和一个子 Assets 的联合,即“BC”将匹配 Assets ,因为我们在父 Assets 和子 Assets 1 中都有 Assets ,但“CD”不匹配,因为没有组合父节点和一个子节点匹配,因为 C 和 D 被拆分到不同的子数据节点。

    有没有办法在 Jackrabbit 中做到这一点?我们可以编写一个 XPath 查询
    \\element(*, dam:Asset)[(@tags = 'C' or *\@tags='C')
    and (@tags = 'D' or *\@tags='D')]

    但这不起作用,因为 XPath 似乎不能保证 *加入的子 Assets 是相同的,即这意味着“任何 child 都有 C/D”,因此将匹配我的 Assets ,因为 1+ 个 child 有一个 C,1+ 个 child 有一个 D。相反,我可以使用 JCR-SQL2
    SELECT * FROM dam:Asset as asset
    LEFT OUTER JOIN nt:unstructured as child ON ISCHILDNODE(child,asset)
    WHERE (asset.tags = 'C' or child.tags = 'C')
    AND (asset.tags = 'D' or child.tags = 'D')

    但没有 SELECT DISTINCT在 JCR-SQL2 中:如果相反,我搜索“B E”,我将得到此 Assets 返回两次,因为这与 Assets +child1 和 Assets +child2 匹配。

    我可以对 Java 中的查询结果进行后处理,即过滤掉第一种情况的假阳性匹配或过滤掉第二种情况的重复结果,但我很担心这会如何影响分页性能:我需要扫描更多节点不需要清除坏节点,我需要扫描批次以计算正确的分页结果大小。对于第二个 SQL2 案例,这应该更便宜,因为如果我的搜索是有序的,我可以仅根据节点路径发现重复项,并且所有重复项都将是连续的,因此我可以通过廉价扫描找到给定页面的数据值(value),但希望无需阅读每个结果的整个节点,但即使对于简单的仅路径情况,我也不知道为分页计数扫描所有结果的成本。

    我们考虑的另一个选择是将标签非规范化为单个节点。在这种情况下,为了保持搜索准确,这意味着在每个子节点中创建一个新的 combine_tags 属性并仅对子节点集执行所有搜索。然而,如果我们匹配同一 Assets 下的两个子节点,这仍然会遇到明显的问题。

    感谢您的任何建议。这已经是一个大型实例,需要进一步扩展。我看到其他问题说 ModeShape 是一个 JCR 实现,它确实有 SELECT DISTINCT但我认为为此切换到 ModeShape 将是最后的手段,如果确实可以在 ModeShape 上托管 CQ。

    我们现在提出的一个想法是计算 Assets 标签和子标签的每个联合并将标签组合成一个字符串,然后将每个值写为 Assets 的多值属性,即 Assets + child1 = "ABCE"和 Assets + child2 = "ABDE",所以我们得到
  • Assets :标签 = A、B; tagUnions = "A B C E", "A B D E"

  • 只要我们定义将标签组合成字符串的固定顺序(例如字母顺序),我们就可以使用 tagUnions LIKE '%B%C%' 搜索任何组合。 (除了在实际情况下我会在标签之间使用适当的分隔符)。虽然就我们所见,这将起作用,但我并不真正喜欢它:每个 Assets +子项可能有大量标签,所有标签的名称都比单个字母长,这意味着我们最终会执行长字符串 LIKE对所有可能无法有效索引的查询。

    另一种做法是制作位掩码:定义 A=1、B=2 等,并在此处存储多值整数数组,然后执行按位比较。然而,这可能仅限于 64 个不同的标签,而且由于我们有 1,000 多个标签,我认为我们无法做到这一点——即使 JCR 支持按位运算,我预计它不会。

    所以我仍在寻找一个干净的类似数据库的解决方案。你已经错过了我提供的赏金,但仍然有滴答声、选票和对任何帮助的感激之情。

    最佳答案

    来自 the Apache Jackrabbit mailing list :

    Yes, unfortunately union queries are not supported. Any work on that area would be much appreciated.

    Meanwhile the best workaround is probably to do two separate queries and to explicitly perform the union in the application code by combining the two result sets.



    所以,这是一个选项。查看您提供的 SQL:

    but there's no SELECT DISTINCT in JCR-SQL2: if instead I search for "B E" I will get this asset returned twice because this matches both asset+child1 and asset+child2.



    我查看了 Jackrabbit 支持的可能解决方案,结果空手而归。但是,我同意提出的解决方案 here :

    What I did is to do a simple SELECT with appropriated ORDER BYs... then each time I used a row, I veried that it isn't the same as the previous :-)



    (切片保存。)

    ORDER BY除非您需要数据库支持的排序,否则可能是可疑的,是否有什么阻止您在 Controller 中构建哈希集以将结果限制为仅使用 JCR API 的唯一值?

    关于Jackrabbit 跨连接节点搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9871554/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com