有几种方法可以在JCR中实现标记.您选择哪个选项取决于您自己的应用程序的需求.以下是我所知道的四个选项.

选项1:使用Mixins

为每个标记定义一个mixin节点类型定义,它是一个标记mixin(它没有属性定义或子节点定义),使用NodeTypeManager动态注册它们.然后,当您想要“标记”节点时,只需向该节点添加表示标记的mixin.任何节点都可以有多个标记,您可以查询具有特定标记的所有节点.

(在此响应的其余部分中,“acme”用作通用名称空间.您应该将其替换为适合您自己的应用程序和组织的名称空间.)

例如,给定标记“acme:tag1”,您可以使用简单查询找到具有此标记的所有节点:

SELECT * FROM [acme:tag1]

这种方法的缺点是维护标签很麻烦.创建新标记需要注册新节点类型.您不能轻易地重命名标记,而是必须使用新名称为标记创建mixin;找到mixin代表旧标签的所有节点,删除旧的mixin,然后添加新的mixin;最后删除旧标记的节点类型定义(在任何地方不再使用之后).删除旧标签以类似的方式完成.另一个缺点是将附加元数据(例如,显示名称)与标签相关联并不容易,因为在节点类型定义上不允许额外的属性.

这种方法应该表现得很好.

选项2:使用分类法和强引用

在此方法中,您将在存储库的区域中创建一个简单的节点结构,您可以在其中为每个标记创建节点(例如,分类).在此节点上,您可以设置描述标记的属性(例如,显示名称);可以随时更改这些属性(例如,重命名标记).

然后,要将标记“应用”到节点,您只需要创建某种与标记的关系.一种方法是定义一个mixin节点类型,其中包含REFERENCE类型的“acme:tags”多值属性.如果要将一个或多个标记应用于节点,只需将mixin添加到节点,并将“acme:tags”属性设置为标记节点.

要查找特定标记的所有节点,可以在标记节点上调用“getReferences()”以查找包含对标记节点的引用的所有节点.

这种方法的好处是必须在一个或多个分类法(包括可能是用户特定的分类法)内控制/管理所有标签.但是,也有一些缺点.首先,REFERENCE属性的性能可能不是很好.一些JCR实现完全不鼓励使用REFERENCES. ModeShape没有,但是当有许多节点包含对同一节点的引用时(例如,许多具有单个标记的节点),ModeShape可能会开始降低REFERENCE性能.

选项3:使用分类法和弱引用

此选项与上面的选项2类似,但“acme:tags”属性为WEAKREFERENCE而不是REFERENCE.您仍然可以定义和管理一个或多个分类法.要查找具有特定标记的节点,您不能在标记节点上使用“getReferences()”方法(因为它们不适用于WEAKREFERENCE属性),但您可以使用查询轻松执行此操作:

SELECT * FROM [acme:taggable] AS taggable

JOIN [acme:tag] AS tag ON taggable.[acme:tags] = tag.[jcr:uuid]

AND LOCALNAME(tag) = 'tag1'

这种方法确实强制使用一个或多个分类法,使得控制标签更容易,因为它们必须存在于分类中才能使用.重命名和删除也更容易.性能方面,这比REFERENCE方法更好,因为WEAKREFERENCE属性在大量引用时表现更好,无论它们是指向一个节点还是多个节点.

缺点是您可以删除标记,即使它仍在使用,但包含对该删除标记的WEAKREFERENCE的节点将不再有效.这可以通过应用程序中的某些约定来解决,或者通过简单地使用分类法上的元数据来表示特定标记是“已弃用”且不应使用. (IMO,后者实际上是这种方法的一个好处.)

此选项通常比选项2更好地执行和扩展.

选项4:使用字符串属性

另一种方法是简单地使用STRING属性来标记每个节点以及要应用的标签的名称.例如,您可以定义一个mixin(例如,“acme:taggable”)来定义多值STRING属性,当您想要标记一个节点时,只需添加mixin(如果尚未存在)并添加名称标记为“acme:tags”STRING属性的值(同样,如果它尚未作为值存在).

这种方法的主要优点是它非常简单:您只是在要标记的节点上使用字符串值.要查找使用特定标记标记的所有节点(例如“tag1”),只需发出查询:

SELECT *

FROM [acme:taggable] AS taggable

WHERE taggable.[acme:tags] = 'tag1'

标签管理很简单:没有管理.如果要重命名标记,则可以重命名标记值.如果要删除标记(并从用其标记的节点中删除),则可以通过从“acme:tags”属性中删除值(可能在后台作业中)来完成.

请注意,这允许使用任何标记名称,因此最适用于根本不控制标记名称的情况.如果要控制用作标记值的字符串列表,只需在存储库中创建分类(如上面的选项2和3中所述),并让应用程序将值限制为分类中的值.您甚至可以拥有多个分类,其中一些可能是特定于用户的.但是这种方法与选项2或3没有完全相同的控制.

此选项将比选项3执行得更好(因为查询更简单),但也会扩展.

java jcr_java – 通过JCR实现基于标签的搜索系统的最佳方式,如Modeshape相关推荐

  1. java项目-第94期基于ssm的在线答题系统-计算机毕业设计

    java项目-第94期基于ssm的在线答题系统 [源码请到资源专栏下载] 1.项目简述 该项目是一款漂亮的在线答题系统,用户登录系统可以进行各行各业的答题. 管理员可以登录超级后台进行用户管理.试题库 ...

  2. Java基础案例3-1:基于控制台的购书系统

    [案例3-1]基于控制台的购书系统 [案例介绍] 伴随互联网的蓬勃发展,网络购书系统作为电子商务的一种形式,正以其高效.低成本的优势逐步成为新兴的经营模式,人们已经不再满足互联网的用途仅仅局限于信息的 ...

  3. 有赞基于ES的搜索系统架构是如何演进的?

    本文从架构上介绍了有赞搜索系统演进产生的背景以及希望解决的问题. 有赞搜索平台是一个面向公司内部各项搜索应用以及部分 NoSQL 存储应用的 PaaS 产品,帮助应用合理高效的检索和多维过滤功能.有赞 ...

  4. 一种基于智能卡登录Windows系统的实现方式

    随着Windows操作系统的发展,Windows操作系统开机登录程序也在不断改进.在Windows Vista和Windows 7操作系统中,微软取消了Windows NT/2000中交互式登录支持的 ...

  5. 基于javaweb的日记系统(java+jsp+bootstrap+servlet+mysql)

    基于javaweb的日记系统(java+jsp+bootstrap+servlet+mysql) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/idea/my ...

  6. java pop邮件 源码_[源码和文档分享]基于JavaMail的邮件收发系统

    摘 要 电子邮件在当今社会中扮演了一个很重要的角色.越来越多的人在使用它.而且用它的人数势必会继续增加.本文介绍了Javamail邮件收发系统的开发背景,对国内外现有的多种成熟的电子邮件系统进行分析和 ...

  7. java a标签正则_正则表达式:java中婚配HTML中a标签中的中文字符

    正则表达式:java中匹配HTML中a标签中的中文字符 今天群里一位朋友问到了一个正则表达式的问题,有如下内容: 特432 453543 a1特123你好123吗? 特2 标签中的文字现在要匹配出内容 ...

  8. 笔记:基于标签的推荐系统、基于图的推荐算法、PersonalRank

    笔记:基于标签的推荐系统.基于图的推荐算法.PersonalRank 发表于11个月前(2015-05-26 19:15)   阅读(44) | 评论(0) 2人收藏此文章, 我要收藏 赞0 原文:h ...

  9. Java 调用http接口(基于OkHttp的Http工具类方法示例)

    目录 Java 调用http接口(基于OkHttp的Http工具类方法示例) OkHttp3 MAVEN依赖 Http get操作示例 Http Post操作示例 Http 超时控制 工具类示例 Ja ...

最新文章

  1. [UE4蓝图教程]蓝图入门之变量使用
  2. Centos7使用yum源安装mysql5.7和redis
  3. 笔记本8G+256G固态免费送,吃鸡不吃力,包邮!
  4. C语言笔记(关键字)
  5. python绝对导入_Python中的绝对导入和相对导入
  6. GIT插件EGIT使用手册
  7. 三菱GXWorks2 CPU软元件存储器的全部清除
  8. 大数据与云计算课后习题
  9. plsql+FileZilla显示乱码问题
  10. XP高仿win7宽栏风格主题
  11. Easy Algorithms系列——详解递归与分治
  12. 华硕 x570 Ryzen 9 5900X电脑 Hackintosh 黑苹果efi引导文件
  13. html 文件常用格式
  14. EtherCAT主站SOEM源码解析----ecx_siiPDO()
  15. 数字图像处理-美图秀秀:瘦脸算法
  16. 递归解决常见爬楼梯走一步或是两步问题,走多步也是相同的道理!
  17. 【软件测试】稳定性和可靠性测试在软件开发中的重要性
  18. 揭秘国漫《武动乾坤》制作幕后 动作戏竟然真人演
  19. 全职宝妈卖出去5万多元的保暖袜子 只用这一招截流
  20. GO 编程模式学习笔记——GO GENERATION

热门文章

  1. MATLAB函数downsample的用法详解
  2. Golang将密码盐加密
  3. 世界 IT 公司 20 强企业的敏捷转型实例
  4. echarts - 折线图 - 每分钟刷新数据并显示
  5. 如何用自己电脑架设服务器
  6. 深入浅出Java23种设计模式(一)
  7. 技术探究|Apache Pulsar 认证与鉴权实践指南
  8. Let's go home 【2-sat 经典作图】+【scc判定有无解】
  9. matching wildcard is strict, but no declaration can be found for element forcontext:property-plac
  10. 华硕ASUS B250M PLUS+i5 7500+核显+macos12.0+opencore0.7.2