清除过滤器
文章
Louis Lu · 十一月 2, 2021
本文档向您介绍 InterSystems IRIS®数据平台如何处理数据库加密,这是所有企业安全战略的重要组成部分。
本文档介绍了数据库加密的情况,并引导您完成一些与创建加密数据库有关的初始任务。一旦您完成了本指南,您将创建一个密钥文件,激活该密钥文件,然后用它来加密一个数据库。这些活动被设计成只使用默认的设置和功能,这样您就可以熟悉该功能的基本原理,而不必处理那些离题的细节(尽管这些细节在执行实现时可能很重要)。有关数据库加密的完整文档,请参见 Encryption Guide(《加密指南》)。
要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems First Looks(《InterSystems 技术概要》)。
为什么数据库加密很重要
虽然加密并不能防止对机密或个人信息的所有不当或未经授权的使用或披露,但确保静止数据的加密为信息安全提供了一个重要的防御层。在数据库级别实施加密为您的信息保护控制提供了一个额外的维度。
此外,许多有关敏感信息或个人信息的法律和法规建议或要求处理数据的组织采用加密作为第一道防线。这些包括法律和法规,如:
《健康保险携带和责任法案》(Health Insurance Portability and Accountability Act,HIPAA )——要求安全保护健康(Secure Protected Health)信息是不可读、不可破译和不可恢复的
马萨诸塞州 201 《马萨诸塞州法规法典》(Code of Massachusetts Regulations,CMR) 17.00——要求个人信息在传输和静止时进行加密
纽约州 23 《纽约法典、规则和条例》 (NewYork Codes, Rules and Regulations,NYCRR) 500 部分——处理非公开信息的金融和其他涉及的组织必须利用加密作为保护数据的一种手段。
欧盟《通用数据保护条例》(General Data Protection Regulation,GDPR)——安全保障要求将加密作为一种保护控制考虑在内
意大利《个人数据保护法》(Personal Data Protection Code,PDPC)——《最低数据安全措施技术规范》(Technical Specifications on Minimum Data Security Measures)第 24 条要求对披露健康和性生活的数据进行加密处理
澳大利亚隐私原则(Australian Privacy Principles,APP)原则 4——强有力的加密实现解决了必要的隐私增强技术,以确保个人信息的安全
日本经济产业省(Ministry of Economy, Trade, and Industry,METI)指南——如果未加密的个人或机密信息遭到泄露,必须进行监管调查,因为根据《个人信息保护法》(Act on the Protection of Personal Information,APPI)第 20 条,个人信息的处理者有义务防止信息的泄漏、丢失或损坏
请注意,这些法律要求中有许多集中在数据泄露上,因为这是一种越来越普遍的现象,但目前的框架要求组织有义务通过适当的安全控制来解决风险,如基于角色的访问、密码保护、入侵检测、数据丢失预防和日志/审计 ——以及加密。加密本身并不能满足所有的强制性要求,但提供了一个安全的基础。数据库级别的加密
通过要求攻击者不仅要获得对系统或文件空间的访问权限,而且要有访问数据库的权限,从而加强了保护。这一附加层为组织、其客户和任何利益相关者提供了保证。
InterSystems IRIS 如何使用数据库加密
对于与数据库操作相关的活动,InterSystems IRIS 的加密和解密过程对用户是透明的。从终端用户或应用程序开发人员的角度来看,应用程序只需执行其常规活动(activity),数据就会自动在磁盘上加密。从系统管理员的角度来看,有几个简单的任务可以确保数据加密的发生;在执行这些任务后,加密的过程又是在背后执行的。
更重要的是,这些活动使用最少的处理器时间,所以它们对您的应用程序没有明显的影响。此外,由于我们数据库的构建方式,这些活动被高度优化。
加密和解密在密码块链接(Cipher Block Chaining,CBC)模式中使用美国政府高级加密标准(United States Government Advanced Encryption Standard,AES),通常简称为 AES CBC。InterSystems IRIS 支持 AES CBC 的所有合法密钥大小:128–、192–和 256–位密钥。
InterSystems IRIS 使用最快的可用实现(available implementation)执行加密和解密。只要有可能,加密和解密就会利用基于处理器的指令集及其固有的效率。现代英特尔(Modern Intel)和 IBM POWER8 处理器都有这样的指令。InterSystems IRIS 自动检测并使用这些指令,所以您不需要采取任何行动来实现它。在英特尔(Intel)处理器上,这些是高级加密标准新指令(Advanced Encryption Standard New Instructions,AES-NI);在 IBM 上,它们是 AES VMX 指令集。
您可以将数据库加密密钥存储在支持密钥管理互通协议(key management interoperability protocol,KMIP)的密钥管理服务器上,或者存储在包含数据库密钥加密副本的文件中。每个都有自己的优势:
KMIP 是一个 OASIS 标准协议,用于客户端与密钥管理系统通信。KMIP 服务器可以是专门的硬件设备,或是运行密钥管理软件的通用服务器。
当数据库加密密钥存储在文件中时,InterSystems 使用多层 AES 密钥封装算法对密钥进行加密,并使用 PBKDF2 算法派生出单个管理员密钥加密密钥,从而使字典攻击和暴力破解变得不切实际。
必须记住,虽然数据库加密是安全策略的一个组成部分,但它不能单独解决安全漏洞。其他工具,如动态数据保护,也是至关重要的。这就是为什么数据库加密是 InterSystems IRIS 为保护数据而提供的一整套工具的一部分。这些包括:
支持政府标准——您可以将 InterSystems IRIS 配置为使用经过验证符合联邦信息处理标准 140–2(Federal Information Processing Standards 140–2,FIPS 140-2)的库进行数据库加密。这在 Red Hat Linux 上是可用的。
保护选定的数据元素——被称为数据元素加密,该功能提供了一种编程方法,允许您只对记录的选定部分进行加密,如信用卡或身份识别号码。
保护动态数据——InterSystems IRIS 使用最新版本的传输层安全协议(Transport-Layer Security,TLS)保护动态数据。TLS 是保护数据通信的行业标准协议。
支持第三方授权——InterSystems IRIS 支持在第三方网站上使用资源的授权,就像在 web 上经常看到的通过 QQ 或微信登录以使用一个网站。这是通过开放授权框架(Open Authorization Framework)2.0 版(称为 OAuth 2.0)实现的,并可能包括通过另一层,称为 OpenID 连接(OpenID Connect)进行身份验证。
亲自尝试数据库加密
使用 InterSystems IRIS 数据库加密很容易。这个简单的程序将引导您完成设置加密数据库的基本步骤。
用前须知
要使用该程序,您需要一个运行中的 InterSystems IRIS 实例。您的选择包括多种类型的已授权的和免费的评估实例。关于如何部署每种类型的实例的信息(如果您还没有可使用的实例),请参见 InterSystems IRIS Basics: Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 Deploying InterSystems IRIS(部署 InterSystems IRIS)。
创建加密密钥
首先,创建一个密钥文件,其中自动包含一个数据库加密密钥:
使用 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中URL described for your instance(为您的实例描述的 URL),在浏览器中打开您的实例的管理门户(Management Portal)。
导航到 Create Encryption Key File(创建加密密钥文件)页面(System Administration(系统管理) > Encryption(加密) > Create New Encryption Key File(创建新的加密密钥文件)):
在 Create Encryption Key File(创建加密密钥文件)页面上:
在 Key File(密钥文件)字段中,输入密钥文件的名称和路径。当您点击 Browse(浏览)按钮时,文件选择对话框(File Selection Dialog) 默认在实例的 install-dir/mgr 目录中打开(其中 install-dir 是 InterSystems IRIS 安装目录),例如, C:\InterSystems\IRIS\mgr\testkeys.key;您可以在所有类型的实例上使用此目录,或者在主机或容器文件系统中选择另一个位置。
在 Administrator Name(管理员名称) 、Password(密码)和 Confirm Password(确认密码)字段中,输入值如 testadmin 和 password。这只是一个示例,所以不要重复使用您在开发环境中使用的密码。
选择靠近页面顶部的 Save(保存) 按钮。
您刚刚在 C:\InterSystems\directory 里创建了 testkeys.key 密钥文件,其中有一个密钥,您可以用它来进行数据库加密。InterSystems IRIS 会显示一条带有密钥的信息,如
有关创建密钥文件及其初始密钥的详细信息,请参见 Create a Key File(《创建密钥文件》)。
激活加密密钥
接下来,激活您刚刚创建的密钥:
在管理门户(Management Portal)中,进入 Database Encryption(数据库加密)页面(System Administration(系统管理) > Encryption(加密) > Database Encryption(数据库加密))。
在数据库加密(Database Encryption)页面,选择 Activate Key(激活密钥) 按钮:
在 Key File(密钥文件) 字段中,输入您创建的密钥文件的位置,如 C:\InterSystems\IRIS\mgr\testkeys.key。
在 Administration Name(管理员名称) 和 Password(密码) 字段中,输入您指定的值(testadmin和 password)。
选择 Activate(激活) 按钮。
您可以在这个页面上看到密钥 ID:
有关激活密钥的详细信息,请参见 Activate a Database Encryption Key from a Key File(《从密钥文件中激活数据库加密密钥》)。
创建加密数据库
现在,您可以创建一个加密数据库:
再次在管理门户(Management Portal)中,进入 Namespaces(命名空间) 页面(System Administration(系统管理) > Configuration(配置) > System Configuration(系统配置) > Namespaces(命名空间))。
在 Namespaces(命名空间)页面上,选择 Create New Namespace(创建新的命名空间)。这将显示 New Namespace (新的命名空间) 页面:
在 New Namespace (新的命名空间)页面,输入您要创建的加密数据库的名称,如 ENCDB。
在 Select an existing database for Globals(为 Globals 选择现有的数据库)下拉菜单旁边,选择 Create New Database(创建新的数据库)按钮。这将显示 Database Wizard(数据库向导):
在 Database Wizard(数据库向导)的第一页,在 Enter the name of your database(输入您的数据库名称) 字段中,输入您要创建的数据库的名称,如 ENCDB。输入一个数据库的目录,如 C:\InterSystems\IRISmgr\ENCDB。在该页面上,选择 Next(下一步)。
在下一页,将 Encrypt database(加密数据库)的值从 No 更改为 Yes。在该页面上,选择 Finish(完成)。
回到 New Namespace(新的命名空间)页面,在 Select an existing database for Routines(为例程选择现有的数据库)下拉菜单中,选择您刚刚创建的数据库,如 ENCDB。
选择靠近页面顶部的 Save(保存)按钮,然后在生成的日志的末尾选择 Close(关闭)。
现在您已经创建了一个名为 ENCDB 的加密数据库,它使用 InterSystems IRIS 在您创建密钥文件时创建的密钥。您可以像使用未加密的数据库一样使用这个数据库。由于 InterSystems IRIS 隐藏了所有的加密和解密机制,您可以用通常的方式执行所有的操作,所有数据都会被加密。
有关创建命名空间及其相关数据库的更多详细信息,请参见 InterSystems IRIS System Administration Guide(《InterSystems IRIS 系统管理指南》)中"Configuring InterSystems IRIS(配置 InterSystems IRIS)"一章中的 "Create/Modify a Namespace(创建/修改命名空间)"。有关背景信息, 请参见 Orientation Guide for Server-Side Programming(《服务器端编程指导手册》)中的“Namespaces and Databases(命名空间和数据库)”。
查看加密数据
一旦您创建了加密数据库,您可以像使用其他未加密的数据库一样使用它。唯一的区别是数据的存储方式。要查看存储在加密数据库和未加密数据库中的数据的区别,您可以执行以下简单的测试:
使用 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中为您的实例描述的程序 ,为您的 InterSystems IRIS 实例打开终端(Terminal )。
使用以下命令切换到加密数据库的命名空间:
%SYS>set $namespace="ENCDB" ENCDB>
在 ENCDB 命名空间中,运行以下命令:
ENCDB>for i=1:1:1000 set ^x(i)="This is test number "_i
这将创建一千个持久化变量(persistent variable),包含如下内容 This is test number 22。
要确认您已经成功,请看一个变量的值:
ENCDB>w ^x(22)
This is test number 22 ENCDB>
要打开数据库文件,进入您在上一节中创建的目录,如 C:\InterSystems\IRIS\mgr\ENCDB,并打开数据库文件 IRIS.DAT。您将会看到如下内容:
尝试在文件中搜索 "This is test number"这个字符串。您不会找到它——因为数据库是加密的。事实上,您会发现唯一未加密的字符串是数据库的名称或其加密密钥的标识符。
如果您在未加密的数据库上执行同样的测试,产生的文件将包含以下内容:
请注意,屏幕截图的最后一行包含了在终端(Terminal)设置的变量值。
与数据库加密有关的其他功能
InterSystems IRIS 还具有其他值得注意的数据库加密功能,这些功能对您的实现可能很重要:
KMIP——InterSystems IRIS 允许您在独立于托管实例的服务器上存储密钥。为了与这些服务器通信,InterSystems IRIS 支持密钥管理互通协议(key management interoperability protocol,KMIP)。这使得 InterSystems IRIS 能够从 KMIP 提供的标准化密钥管理方法中获益。
更改密钥和添加或删除加密——您可以轻松地更改数据库的加密密钥。如果需要这些操作,加密一个未加密的数据库或制作一个加密数据库的未加密副本也是很简单的。
对磁盘上的相关数据进行加密——InterSystems 允许您轻松加密其临时缓存数据库和其他用于保持最近事务记录为当前状态的磁盘内容(即其日志文件)。
基于芯片的加密——芯片可以将加密作为其活动的一部分,这为操作提供了更快的速度。InterSystems IRIS 支持使用这种芯片。有关基于芯片的加密的详细信息,请参见下一节。
了解有关数据库加密的更多信息
InterSystems 有很多参考资料可以帮助您了解有关数据库加密的更多信息:
Encryption Awareness(《加密意识》)——InterSystems 在线学习交互式课程,为我们的加密技术提供概念介绍。
Encryption Guide(《加密指南》)——InterSystems 有关数据库加密和相关功能的文档。
FIPS 140–2 Compliance for Database Encryption(《FIPS 140-2 数据库加密的遵从性》)——InterSystems 有关 InterSystems IRIS 支持 FIPS 140-2 标准的文档。
公告
Claire Zheng · 四月 10, 2023
2023年4月14日-16日,2023 CHITEC将在安徽省合肥市合肥滨湖国际会展中心(安徽省合肥市锦绣大道3899号)盛大召开。点击查看CHITEC 2023完整日程。InterSystems将亮相CHITEC,通过展位展示、主题研讨会、分论坛演讲等方式,全方位多角度展示InterSystems“加速评测,助力公立医院高效建设互联互通平台和数据中心”的能力。
1. 欢迎莅临InterSystems展位T28
在展会现场,我们将向您展示InterSystems IRIS医疗版互联互通平台、一体化数据平台、基于FHIR的数据利用和统一语义的数据中心。如果您希望进一步了解详细内容情况,希望得到详细的方案讲解或Demo演示服务,欢迎您通过以下方式进行登记预约。
莅临展位,由展位工作人员为您现场预约;
点击链接,提前预约展位Demo演示。
2. 欢迎报名参加主题研讨会“加速测评,赋能医院高质量发展”
时间:2023年4月14日(周五)13:30-17:00地点:合肥滨湖国际会展中心·综合馆(2号馆)·201会议室 在这次研讨会上,我们将为您带来InterSystems IRIS医疗版互联互通套件的详细解读与分享。您将了解到:
加速测评的五大利器;
统一语义的数据中心建设;
数据利用与应用创新;
现场演示。
点击链接,报名参会。
3. 欢迎关注分论坛主题演讲
在“分论坛:医院集成平台与电子病历建设应用”中,InterSystems中国技术总监乔鹏将与多位行业专家同台献策,分享主题演讲“InterSystems IRIS医疗版互联互通套件,赋能医院高质量发展”,助力医院夯实信息化建设基础,欢迎关注!
时间:2023年4月15日(周六)15:00-15:15
地点:合肥滨湖国际会展中心西区·综合馆(2号馆)·205会议室
文章
Claire Zheng · 一月 7, 2021
亲爱的社区用户,您好! 我们诚挚邀请所有社区成员加入InterSystems Global Masters倡导中心,以便了解最新动态,获取对开发者社区)的贡献积分,并获得奖励!请浏览本文并了解如何加入,有哪些福利可以期待!
点击此处:现在加入
▶️ 什么是 Global Masters?
Global Masters 是一个游戏化平台,您可以在其中完成与InterSystems技术相关的挑战(任务),赢取徽章和积分,并用积分兑换各种奖励! 在这里,每周都会发布5-10 个新挑战,公布开发者社区上最有趣的文章、最佳实践、视频、InterSystems 官方新闻、有趣的学习任务。 这是一个获得最新信息的好方法! ▶️ 具体是什么样的? 下面是挑战和奖励的示例:
▶️ 级别、徽章和特权
Global Masters 中有 6 个级别。您的级别越高,可获得的奖品价值和特权就越高。为开发者社区和 Open Exchange 做出贡献,在 Global Masters 保持活跃以达到最高级别!所有级别和徽章的列表将帮助您晋级到更高级别。
▶️ 如何加入? 从这里开始!
1. 前往globalmasters.intersystems.com,点击“使用 InterSystems 登录名登录”按钮,然后使用您的WRC账号即可加入。
2. 登陆后,找到“自定义你的程序,从这里开始!(Customize your program! START HERE!)”开始挑战。这个初始挑战会解锁每周发布的奖励和新挑战。
不要跳过这个挑战,充分利用这里吧!
点击此处:现在加入
我们在 GM 中心等待所有 InterSystems 开发者的到来!
欢迎您提出任何反馈和想法。请随时与我们联系!InterSystems Global Masters 上见! 😉
文章
Claire Zheng · 二月 21, 2023
InterSystems IRIS数据平台支持列存储,提供更优存储方案,保障系统稳定运行。
文章
Claire Zheng · 二月 6, 2023
InterSystems 开发者竞赛:Tool(工具)已进入投票时间,我们收集到来自全球的21个参赛作品,其中有三个参赛应用来自中国开发者。
以下按提交顺序排名
参赛应用1
Intersystems IRIS platform queue trend monitoring component(Intersystems IRIS平台队列监控组件)
提交者:yubo mao简介:随着医院信息化建设的逐步完善,医院业务接口越来越多,业务接口数据处理可能会由于多种因素(网络、消费方系统等)影响下,出现消息堆积过多甚至造成接口卡顿的情况,影响院内正常业务开展,因此对于业务接口组件队列的的监控愈发重要。 当前Intersystems IRIS平台内置的队列监控界面仅展示接口组件实时队列信息,对于对于医院实际应用场景所需要的队列数据信息提供较为局限。队列监控组件程序是基于Intersystems IRIS平台开发,可以对所有接口组件进行统一监控,并展示组件24h内组件队列信息,也可通过设置时间段查询组件历史队列数据,更好满足当前的院内应用需求。
更多详情,请查看参赛者文章及应用:
文章:Queue monitoring
应用:应用已上传至InterSystems Open Exchange
参赛应用2
message_key_query(消息键查询)
提交者:王喆简介:随着新型冠状病毒肺炎的流行,医院往往需要对患者信息进行流程调整操作,如输入患者ID查找门诊或住院部、挂号时间等。传统的数据库查询需要专业的程序员来处理,而使用该方案从界面上可以直接快速定位到患者在医院的挂号和就诊相关信息和时间。
更多详情,请查看参赛者文章及应用:
文章:IRIS快速查询服务思路分享
IRIS quick query service idea sharing
应用:应用已上传至InterSystems Open Exchange
参赛应用3
iris_log_analytics(IRIS log分析)
提交者:银行 郝简介:此方案用于监控IRIS平台事件日志相关信息,包括事件日志列表、日志详细信息、日志类型占比、日志数量最高组件Top7、近7天内日志数量波形图。
更多详情,请查看参赛者文章及应用:
应用:应用已上传至InterSystems Open Exchange
投票已经开始啦,欢迎为你感兴趣的应用投出宝贵的票票!
🔥 投票选出最佳应用程序 🔥 非常棒的应用,欢迎大家踊跃投票! 截至2月7日的投票结果分享-
Since the beginning of the voting we have the results:
Expert Nomination, Top 5
OpenAPI-Suite by @Lorenzo Scalese
irissqlcli by @Dmitry Maslennikov
iris-tripleslash by @Henry Pereira
Intersystems IRIS platform queue trend monitoring component by @Yubo Mao
message_key_query by @王喆
➡️ Voting is here.
Community Nomination, Top 5
Intersystems IRIS platform queue trend monitoring component by @Yubo Mao
iris-tripleslash by @Henry Pereira
message_key_query by @王喆
DX Jetpack for VS Code by @John Murray
OpenAPI-Suite by @Lorenzo Scalese
➡️ Voting is here.
So, the voting continues.
Please support the application you like!
文章
Claire Zheng · 六月 8, 2023
医院管理者、信息中心、业务骨干,每个角色都有独特的业务诉求,InterSystems IRIS医疗版互联互通套件专为国内用户设计,可助力医院用户释放数据价值,推动应用创新!截至目前,InterSystems技术已助力150余家医院通过四级及以上医院信息互联互通标准化成熟度评测,其中,五级乙等用户近30家。
公告
Claire Zheng · 五月 8, 2021
InterSystems中国正在招聘SE,具体职位需求以英文发布,详情如下,欢迎将简历砸过来 (claire.zheng@intersystems.com)or 私信联系 :)
Intersystems China 系联软件(北京)有限公司, established in 1978 is the trusted Healthcare IT solution provider for many World-Class hospitals and clinics in China, such as China’s largest foreign-invested hospital, United Family Healthcare 和睦家医疗, and one of China’s most prestige medical institution, Peking Union Medical College Hospital 北京协和医院。
The company has a small but collaborative team of talented and passionate individuals working the Greater China Region.
Due to China’s economic growth, aging population and the government’s determination in the Healthcare reform, China has become one of InterSystems’s most important strategic regions with unparalleled growth potentials in the years to come.
Overview
This Channel Sales Manager role will require someone who is passionate about technology within the Greater China Regions.
The role will focus on selling our core product portfolio and HealthShare into the Greater China Region IT channel.
The successful applicant will develop new relationships with Application Partners and System Integrators, whilst maintaining and enhancing relationships with current partners to ensure that Intersystems is there vendor of choice.
This role will suit someone who would like to work for a stable international company, have exposure to working with colleagues from other countries and who wants to be associated with leading edge technology.
Responsibilities
Develop relationships with new application partners and systems integrators.
Manage and motivate current application partners and systems integrators to ensure that Intersystems is their vendor of choice by showing value, enhancing customer experience and being the trusted advisor for them
Develop and execute against sales plan to meet revenue targets.
Work with Marketing to develop market awareness of the potential of InterSystems products, organise industry events and initiatives.
Create and maintain a healthy pipeline
Provide accurate forecasting to the management team.
Maintain awareness of industry sector and technological advances
Qualifications
Strong knowledge and experience in building and expanding solid partner ecosystem;
Capability and Experience of closing deals and transaction execution within limited time, driven by success and results.
In depth experience in and understanding of the IT sales channel within The Greater China Region.
Demonstrable experience developing Application Partner and System Integrators
Proven track record in exceeding quotas
Previous experience in developing and successfully executing against a sales plan
Ability to develop strong relationships with key decision makers and influencers with win-win strategy and be the trusted advisor to customers.
Ability to think and work creatively to develop unique value propositions for specific partners or customers
Experience negotiating and motivating a mutually agreeable and positive contracts
Fluent written and communication skills both in Mandarin and English.
Experience in Healthcare is not mandatory but a plus.
文章
Louis Lu · 十一月 2, 2021
本文档向您介绍 InterSystems IRIS®数据平台对 SQL 文本搜索的支持,它为各种语言的非结构化文本数据提供语义上下文搜索。它涵盖了以下主题:
为什么 SQL 搜索很重要
InterSystems IRIS 如何实现 SQL 搜索
尝试 SQL 搜索
有关 SQL 搜索的更多信息
本文档介绍了 SQL 上下文感知文本搜索,并介绍了一些与索引文本数据相关的初始任务,以进行搜索和执行 SQL 搜索。一旦您完成了这个探索,您将在一个 SQL 列中为文本搜索建立索引,并执行几种类型的搜索。这些活动被设计为只使用默认设置和功能,以便您熟悉该功能的基本原理。有关 SQL 搜索的完整文档,请参见 SQL Search Guide(《SQL 搜索指南》)。
处理非结构化文本的一个相关但独立的工具是自然语言处理(Natural Language Processing,NLP)。SQL 搜索假定您知道要查找的内容。NLP 文本分析允许您在没有事先了解文本内容的情况下分析文本的内容 。
要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems First Looks(《InterSystems 技术概要》)。
为什么 SQL 搜索很重要
快速搜索非结构化文本数据的能力是访问许多公司和机构普遍存储的大量文本内容的基础。任何此类数据的搜索工具必须具有以下功能:
快速搜索:InterSystems IRIS SQL 搜索可以快速搜索大量的数据,因为它搜索的是生成的优化数据索引,而不是顺序搜索数据本身。
单词感知(Word-aware)搜索:SQL 搜索不是字符串搜索,它是基于文本中语义结构的搜索。SQL 搜索的最基本的语义结构是单词。这就减少了在字符串搜索中发现嵌入另一个单词中的字符串,或当字符串连接两个单词时产生的误报数量。
实体感知(Entity-aware)搜索:SQL 搜索考虑了多个单词,这些单词根据语义关系分组形成实体。因此,它可以搜索指定顺序(位置短语)中的多个单词、出现在彼此特定接近范围内的单词(无论顺序如何),以及在实体的开头或结尾找到的单词。这使您能够将搜索范围缩小到在其他单词的指定上下文中找到的一个单词(或短语)。
语言感知(Language-aware)搜索:识别单词之间的语义关系是基于语言的。SQL 搜索包含十种自然语言的语义规则(语言模型)。它还提供对其他语言的支持。它不需要创建或关联字典或本体。
模式匹配:SQL 搜索同时提供通配符匹配和正则表达式(RegEx)匹配,来匹配字符模式。
模糊匹配:SQL 搜索为近似匹配提供模糊搜索,这些搜索考虑了搜索字符串的计算变化程度。这使拼写错误的匹配成为可能。
派生匹配:SQL 搜索可以使用分解来匹配词根和组件词。SQL 搜索可以使用同义词表来匹配同义词和短语。
InterSystems IRIS 如何实现 SQL 搜索
SQL 搜索可以搜索在 SQL 表的列中发现的文本数据。为了做到这一点,您必须为包含文本数据的列创建一个 SQL 搜索索引。InterSystems 将表列实现为持久化类中的属性。
有三个级别的索引可用,每个级别都支持附加的功能以及较低级别的所有功能:基本(Basic)、语义( Semantic)和分析(Analytic):
基本(Basic)支持单词搜索和位置短语搜索,包括使用通配符、短语中单词之间的范围、正则表达式(RegEx)匹配和共同出现搜索。
语义(Semantic) 支持所有的基本功能,并且还支持 InterSystems IRIS 自然语言处理(NLP)实体。它可以搜索实体,以及以实体开头或以实体结尾的单词或短语。它能识别 NLP 的属性,比如否定。
分析(Analytic) 支持所有的语义(Semantic)功能,也支持 NLP 路径。它还可以根据 NLP 优势和接近度分数进行搜索。
填充索引。像所有的 SQL 索引一样,您可以在数据填充表之后直接构建索引,也可以在将记录插入空表时让 SQL 自动构建索引条目。无论哪种情况,SQL 都会自动更新此索引作为后续插入、更新或删除操作的一部分。
您执行 SQL 搜索,编写一个 SELECT 查询,其中的 WITH 子句包含 %ID %FIND search_index() 语法。search_index() 函数的参数包括 SQL 搜索索引的名称和搜索字符串。这个搜索字符串可以包括通配符、位置短语和实体语法字符。搜索字符串还可以包括 AND、OR 和 NOT 逻辑运算符。
尝试 SQL 搜索
使用 InterSystems IRIS SQL 搜索很容易。这个简单的程序将引导您完成搜索以字符串形式存储在 SQL 表列中的文本数据的基本步骤。
要使用该程序,您需要一个正在运行的 InterSystems IRIS 实例。您对 InterSystems IRIS 的选择包括多种类型的已授权的和免费的评估实例;该实例不需要在您正在工作的系统中(尽管它们必须相互具有网络访问权限)。关于如何部署每种类型的实例的信息(如果您还没有可使用的实例),请参见 InterSystems IRIS Basics: Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 Deploying InterSystems IRIS(部署 InterSystems IRIS)。
您还将使用一个 IDE,如 VS Code 或 Studio,在实例中创建 ObjectScript 代码。有关设置这些 IDE 并将其连接到您的实例的说明,请参见 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 Visual Studio Code 或 Studio。。
用前须知
要使用该程序,您需要一个正在运行的 InterSystems IRIS 实例。您对 InterSystems IRIS 的选择包括多种类型的已授权的和免费的评估实例;该实例不需要在您工作的系统中(尽管它们必须相互具有网络访问权限)。关于如何部署每种类型的实例的信息(如果您还没有可使用的实例),请参见 InterSystems IRIS Basics: Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 Deploying InterSystems IRIS(部署 InterSystems IRIS)。
您还需要从 GitHub repo https://github.com/intersystems /Samples-Aviation 获得 Aviation.Event 表和相关文件。
下载和设置示例文件
Samples-Aviation 源(sources)必须可由实例访问。下载文件的程序取决于您所使用的实例类型,如下所示:
如果您使用的是 ICM 部署的实例:
使用带有 -machine 和 -interactive 选项的 icm ssh 命令,在托管实例的节点上打开默认 shell,例如:
icm ssh -machine MYIRIS-AM-TEST-0004 -interactive
在 Linux 命令行上,使用以下命令之一将 repo 克隆到实例的数据存储卷(data storage volume)。例如,对于部署在 Azure 上的配置,数据卷的默认挂载点(default mount point)是 /dev/sdd,因此您可以使用如下命令:
$ git clone https://github.com/intersystems/FirstLook-SQLBasics /dev/sdd/FirstLook-SQLBasics OR
$ wget -qO- https://github.com/intersystems/FirstLook-SQLBasics/archive/master.tar.gz | tar xvz
-C /dev/sdd
这些文件现在对容器文件系统上 /irissys/data/FirstLook-SQLBasics 中的 InterSystems IRIS 可用。
如果您正在使用通过其他方式部署的容器化实例(授权版或社区版(Community Edition)):
在主机上打开 Linux 命令行。如果您在云节点上使用社区版(Community Edition),请使用 SSH 连接该节点,如在 Deploy and Explore InterSystems IRIS(《部署和探索 InterSystems IRIS》)中所述。
在 Linux 命令行上,使用 git clone 或 wget 命令,如上所述,将 repo 克隆到容器中挂载为卷(mounted as a volume)的存储位置。
对于社区版(Community Edition)实例,您可以克隆到实例的持久化 %SYS 目录 (存储特定于实例的配置数据的目录)。在 Linux 文件系统中,这个目录是 /opt/ISC/dur。这使得文件对容器文件系统上 /ISC/dur/FirstLook-SQLBasics 中的 InterSystems IRIS 可用。
对于已授权的容器化实例,选择容器中作为卷挂载(mounted as a volume)的任何存储位置(如果使用它,包括持久化 %SYS 目录)。例如,如果您的 docker run 命令包含选项 -v /home/user1:/external,并且您将 repo 克隆到 /home/user1, 则文件对容器文件系统上 /external/FirstLook-SQLBasics 中的 InterSystems IRIS 可用。
如果您使用的是 InterSystems 学习实验室(Learning Labs)实例:
在集成 IDE 中打开命令行终端。
将目录更改为 /home/project/shared 并使用 git clone 命令克隆 repo:
$ git clone https://github.com/intersystems/FirstLook-SQLBasics
该文件夹被添加到左边资源管理器(Explorer)面板的 Shared (共享)下,并且该目录对 /home/project/shared 中的 InterSystems IRIS 可用。
如果您使用的是已安装的实例:
如果实例的主机是安装了 GitHub 桌面(GitHub Desktop)的 Windows 系统:
在主机的 web 浏览器中进入 https://github.com/intersystems/Samples-Aviation。
选择 Clone or download(克隆或下载) ,然后选择 Open in Desktop(在桌面上打开)。
这些文件对您的 GitHub 目录中的 InterSystems IRIS 可用,例如在
C:\Users\User1\Documents\GitHub\FirstLook-SQLBasics 中。
如果主机是 Linux 系统,只需在 Linux 命令行上使用 git clone 命令或 wget 命令,就可以将 repo 克隆到您所选择的位置。
一旦您获得了示例文件,请按照"设置说明"下的 Samples-AviationREADME.md 文件中提供的步骤操作:
创建一个名为 SAMPLES 的命名空间,如下所示:
使用 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中URL described for your instance(为您的实例描述的 URL),在浏览器中打开您的实例的管理门户(Management Portal)。
选择 System Administration(系统管理) > Configuration(配置) > System Configuration(系统配置) > Namespaces(命名空间) ,进入 Namespaces(命名空间)页面。
在 Namespaces(名称空间) 页面,选择 Create New Namespace(创建新的命名空间)。这将显示 New Namespace(新命名空间) 页面; 按照 System Administration Guide(《系统管理指南》) 中“Configuring InterSystems IRIS(《配置 InterSystems IRIS》)”章节中 Create/Modify a Namespace(创建/修改命名空间)中的说明使用此页面。 调用新的命名空间 SAMPLES。
选择靠近页面顶部的 Save(保存) ,然后在生成的日志末尾选择 Close(关闭)。
使 SAMPLES web 应用程序与 InterSystems IRIS 分析(Analytics) 一起使用:
a.在管理门户(Management Portal)中,点击 System Administration(系统管理) > Security(安全) > Applications(应用程序) > Web Applications(web 应用程序)。
b.点击最左侧列中的 /csp/samples 链接(假设您创建的命名空间名为 SAMPLES)。
c.在 Enable(启用) 部分,选择 Analytics(分析)。
d.点击 Save(保存)。
使用 InterSystems IRIS Basics:Connecting an IDE( 《InterSystems IRIS 基础:连接一个 IDE》)中procedure described for your instance(为您的实例描述的程序)打开 InterSystems 终端(Terminal),并输入以下命令,更改加载示例的命名空间:
set $namesapce="SAMPLES"
输入以下命令,将 .path 替换为包含您克隆或下载的 repo 的 README.md 和 LICENSE 文件的目录的完整路径:
do $system.OBJ.Load("<path>\buildsample\Build.AviationSample.cls","ck")
输入以下命令:
do ##class(Build.AviationSample).Build()
当出现提示时,输入包含 README.md 和 LICENSE 文件的目录的完整路径。然后,该方法加载和编译代码,并执行其他需要的设置步骤。
创建和测试一个基本的 SQL 搜索索引
一旦代码编译完成(可能需要一两分钟),继续执行以下步骤:
使用您选择的 IDE,通过在 SAMPLES 命名空间中定义以下类(class)来创建基本 SQL 搜索(Basic SQL Search)索引:
Class Aviation.TestSQLSrch Extends %Persistent
[DdlAllowed,Owner={UnknownUser},SqlRowIdPrivate,
SqlTableName=TestSQLSrch ]
{
Property UniqueNum As %Integer;
Property Narrative As %String(MAXLEN=100000) [ SqlColumnNumber=3 ];
Index NarrBasicIdx On (Narrative) As %iFind.Index.Basic(INDEXOPTION=0,LANGUAGE="en",LOWER=1);
Index UniqueNumIdx On UniqueNum [ Type=index,Unique ];
}
这个示例创建了一个持久化类(表),其中包含一个 Narrative 属性(列),并为这个属性定义了一个基本 SQL 搜索(Basic SQL Search)索引。因为这是一个新类,所以您必须用文本数据填充表。
用文本数据填充表并构建 SQL 搜索索引。SQL 搜索索引的构建和维护与任何其他 SQL 索引一样。
并输入以下命令,以使用您下载的 Aviation.Event 表中的文本数据填充新表。在这个示例中,SQL 搜索索引是在添加每条记录时自动构建的:
set $namespace = "SAMPLES"
set in1="INSERT OR UPDATE INTO Aviation.TestSQLSrch (UniqueNum,Narrative) "
set in2="SELECT %ID,NarrativeFull FROM Aviation.Event WHERE %ID < 100"
set myinsert=in1_in2
set tStatement=##class(%SQL.Statement).%New()
set qStatus=tStatement.%Prepare(myinsert)
if qStatus'=1 {write "%Prepare failed:" DO $System.Status.DisplayError(qStatus) quit}
set rset=tStatement.%Execute()
write !,"Total rows inserted=",rset.%ROWCOUNT
出于性能的考虑,您可能希望使用 %NOINDEX 选项来推迟构建索引,直到表被完全填充,然后使用 %Build() 方法构建 SQL 搜索索引(和任何其他定义的索引)。
或者,您可以在已经包含文本数据的现有持久化类中添加 SQL 搜索索引,然后使用 %Build() 方法填充 SQL 搜索索引。
在终端(Terminal)中打开一个 SQL Shell,如在 First Look:InterSystems SQL(《技术概要:InterSystems SQL》)中 Creating and Populating a Table With a SQL Script File(使用 SQL Script 文件创建和填充表)的前几个步骤中所述,并使用 SQL 搜索作为 SELECT 查询的 WHERE 子句条件。WHERE 子句可以包含由 AND 逻辑关联的其他条件。在 SAMPLES 命名空间运行以下 SQL 查询:
SELECT %iFind.Highlight(Narrative,'"visibility [1-4] mile*" AND "temp* ? degrees"') FROM Aviation.TestSQLSrch
WHERE %ID %FIND search_index(NarrBasicIdx,'"visibility [1-4] mile*" "temp* ? degrees"',0,'en')
Search_index() 函数指定了一个 search_index 参数。这是为要搜索的属性(列)定义的 SQL 搜索索引。它可以是一个基本(Basic)、语义(Semantic)或分析(Analytic)索引。
Search_index() 函数指定了一个 search_item 参数。
这个示例将 search_item 定义为 "visibility [1-4] mile*" "temperature ? degree*"。这将以任意顺序返回包含两个位置短语的所有记录:
"visibility [1-4] mile*"返回单词“visibility”和“mile”之间有 1 到 4 个单词的短语。 因为 mile* 指定了一个通配符,它可以匹配 mile 或 miles。例如,"visibility less than 1 mile ","visibility 10 miles ","visibility approximately 20 statute miles","visibility for many miles"。
"temp* ? degrees"返回以 "temp "开头、以 0 个或更多非空格通配符结尾的单词,一个缺失的单词,然后是单词"degree"的短语。因此,它将返回带有
短语 "temperature 20 degrees","temp. 20 degrees","temperature in degrees",以及(可能是无意的)"temporarily without degrees"。
search_index() 函数可以选择性地指定一个 search_option 参数。
该选项可以对搜索应用可选转换,如下所示:1=词干搜索应用词干匹配词或短语基于他们的词干形式。2=分解搜索将分解应用于复合词。3=模糊搜索将指定的模糊程度(字符差异的数量)应用于搜索。4=正则表达式搜索允许使用 RegEx 匹配进行搜索。这个示例指定了默认值 0,意味着没有搜索转换。
Search_index() 函数可以选择性地指定一个 search_language 参数。您可以指定一种语言,或指定'*'来调用自动语言识别,支持搜索包含多种语言的文本。这个示例指定默认值'en'(英语)。
这个示例还通过将相同的 search_item 应用于返回的记录来突出显示返回的文本。这通过使用 <b> 和 </b> 标签为它们定界来突出这两个短语的每一个实例。
提供这个示例是为了让您初步体验 InterSystems IRIS SQL 搜索。您不应该将这个示例作为开发真正的应用程序的基础。要在实际情况下使用 SQL 搜索,您应该充分研究软件提供的可用选择,然后开发您的应用程序以创建健全和高效的代码。
了解有关 SQL 搜索的更多信息
InterSystems 还有其他参考资料可以帮助您了解有关 SQL 搜索的更多信息,包括:
Using InterSystems SQL Search(《使用 InterSystems SQL 搜索》)
文章
jieliang liu · 九月 22, 2021
技术概要:ObjectScript
技术概要:ObjectScript
本文档将向您介绍 ObjectScript 编程语言,并提供了几个示例,说明如何使用它来存储和检索来自 InterSystems IRIS®数据平台的数据。本技术概要(First Look)并不试图提供对该语言或其功能的全面概述。您可以使用本文件末尾列出的参考资料,继续您的探索。
要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems First Looks(《InterSystems 技术概要》)。
什么是 ObjectScript?
ObjectScript 是一种编程语言,用于在 InterSystems IRIS 数据平台上快速开发复杂的业务应用。ObjectScript 源代码被编译成 object 代码,该代码可针对业务应用程序中的典型操作(包括字符串操作和数据库访问)进行高度优化。
ObjectScript 的独特之处之一是它的底层存储结构,即所谓的 globals。Globals 可以被认为是持久的多维稀疏数组。ObjectScript 允许您直接从 globals 访问数据,但也允许您通过其本机 object 和 SQL 支持来访问这些数据。
<span id="2_Try_It:_Storing_and_Retrieving_Data_Us" class="anchor"></span>虽然您可以在 InterSystems IRIS 平台上使用 Java、.NET、node.js 或其他语言编写应用程序,但通过使用该平台的许多 API,您可以使用 ObjectScript 编写高效的、基于服务器的代码,让您对数据有更精细的控制。
试一试:使用 ObjectScript 存储和检索数据
在这篇技术概要(First Look)中,您将学习如何使用 ObjectScript 来:
在 globals 中存储和检索数据。
定义一个类,并实例化、使用和存储该类的 objects。
使用 SQL 查询访问为该类存储的数据,并对结果集进行处理。
正如您将看到的,ObjectScript 使您能够以多种方式存储和访问数据,既强大又灵活。
用前须知
要使用本技术概要(First Look),您需要一个正在运行的 InterSystems IRIS 实例。您的选择包括几种类型的已授权的和免费的评估实例;该实例不需要由您正在工作的系统托管(尽管您的系统必须能够通过网络访问该实例)。关于如何部署每种类型的实例的信息,如果您还没有一个实例可以使用,请参见(InterSystems IRIS Basics:Connecting an IDE《InterSystems IRIS 基础:连接一个 IDE》)中的Deploying InterSystems IRIS(部署 InterSystems IRIS)。
您也需要知道:
实例的基于 web 的管理门户(Management Portal)的 URL,这是 InterSystems IRIS 的系统管理用户界面。
试一试:使用 ObjectScript 存储和检索数据
如何访问终端(Terminal),InterSystems IRIS 命令行工具。
您的实例的用户名和密码(InterSystems Learning Labs 上的 web 实例不需要)。
您还需要从 InterSystems GitHub repo 下载 ObjectScript 示例代码:https://github.com/intersystems/FirstLook-ObjectScript。
关于如何访问管理门户(Management Portal )或终端(Terminal)的更多信息,请参见InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》) 中的 " InterSystems IRIS Connection Information《InterSystems IRIS 连接信息》)"。尽管您实际上不需要 IDE 来做这些练习,但您可以使用安装了 ObjectScript 扩展的 Studio 或 Visual Studio Code 查看和编辑示例代码 。
导入 ObjectScript 代码示例
首先,将 ObjectScript 代码示例导入 InterSystems IRIS:
从管理门户(Management Portal)的主页,选择 System Explorer(系统资源管理器) > Classes(类)。
在 Classes 页面上,查看左栏,确保您在 USER 命名空间。您可以把命名空间看作是工作空间或目录。
点击 Import(导入)。
在 Import Classes 的对话框中: a. 如果您的 InterSystems IRIS 实例在远程服务器上运行,请指定是将示例文件下载到远程服务器还是下载到您的本地计算机。 b. 在"File" 或 "Directory"的 Import(导入)区域,点击 File(文件)。 c. 浏览您从 GitHub 下载的 FirstLookObjectScript.xml 文件。 d. 选择 Compile Imported Items(编译导入项)。 e. 对于 Compile Flags(编译标志),指定 cuk。 f. 点击 Next(下一步)。 g. 点击 Import(导入)。 h. 当出现加载成功的消息时,点击 Done(完成)。
现在,在 Classes 页面上,您应该看到 FirstLook.ObjectScript.cls 和 FirstLook.Person.cls 在类的列表中。在 InterSystems IRIS 中,包含类的包名称(FirstLook)附加有类的名称(ObjectScript 或 Person)。扩展名 .cls 用来表示类文件。
注意: 如果您的命名空间包含大量的类,可以在页面左栏的 Class Name(类名) 框中输入 F*.cls 来过滤列表。
ObjectScript 和 Globals
如果您想使用一些 ObjectScript 命令,一个很好的方法是使用 InterSystems 终端(InterSystems Terminal)。(如果您以前没有使用过终端(Terminal),请参见InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》) 中的 "InterSystems IRIS Connection Information(《InterSystems IRIS 连接信息》)"。)
在您启动终端会话(Terminal session)后,提示会指示您处于哪个命名空间。如果您不在 USER 命名空间,执行以下命令:
set $namespace = "USER"
试一试:使用 ObjectScript 存储和检索数据
在 ObjectScript 中, 您可以使用 set 命令给变量赋值:
USER>set x = "Welcome to ObjectScript!"
要显示一个变量的内容,请使用 write 命令:
USER>write x
Welcome to ObjectScript!
您刚刚创建的变量只存在于这个终端会话(Terminal session)的工作内存中。如果您想在数据库中存储一个值,您可以使用 global,它看起来像一个带插入符号(^)的变量:
USER>set ^Settings("Color") = "Red"
Globals 提供持久性存储,这意味着在您关闭终端会话后,^Settings 将继续存在。
这个特殊的 global 也是一个数组,有一个下标。与许多其他语言中的数组不同,globals 可以有整数、小数或字符串等下标。Globals 也是稀疏的,这意味着下标可能是连续的,也可能不是连续的。
您可以利用 globals 的多维特性来定义一个更复杂的结构:
USER>set ^Settings("Auto1", "Properties", "Color") = "Red"
USER>set ^Settings("Auto1", "Properties", "Model") = "SUV" USER>set ^Settings("Auto2", "Owner") = "Mo"
USER>set ^Settings("Auto2", "Properties", "Color") = "Green"
要显示 global 中的所有节点,您可以使用 zwrite 命令:
USER>zwrite ^Settings
^Settings("Auto1","Properties","Color")="Red"
^Settings("Auto1","Properties","Model")="SUV"
^Settings("Auto2","Owner")="Mo"
^Settings("Auto2","Properties","Color")="Green"
^Settings("Color")="Red"
要检索存储在 global 特定节点上的值,您可以使用 $get() 函数。如果您试图从不存在的 global 节点检索值,这个函数将返回空字符串,以避免潜在的未定义错误。
在终端(Terminal)尝试以下操作:
USER>set ^testglobal(1) = 8888 USER>set ^testglobal(2) = 9999
USER>set globalValue = $get(^testglobal(1))
USER>write "The value of ^testglobal(1) is ", globalValue The value of ^testglobal(1) is 8888
要在 global 中迭代节点,您可以使用 $order() 函数,它返回 global 中的下一个下标。传入一个下标等于空字符串的 global 节点会导致 $order() 返回第一个下标。返回值等于空字符串表示 $order() 已经到达最后一个下标。
您可以像编写变量或 global 的值一样编写函数返回的值:
USER>write $order(^testglobal("")) 1
USER>write $order(^testglobal(1)) 2
USER>write $order(^testglobal(2))
USER>
在实践中,您通常会在 ObjectScript 类文件中的类方法中创建一个 $order() 循环。在 FirstLook.ObjectScript.cls 中为您提供了以下方法。
试一试: 使用 ObjectScript 存储和检索数据
/// Iterate over global ^testglobal ClassMethod Iterate() {
// Start by setting subscript to "" set subscript = ""
// "Argumentless" for loop for {
// Get the next subscript
set subscript = $order(^testglobal(subscript))
// When we get to the end, quit the for loop quit:(subscript = "")
// Otherwise, write the subscript and the value
// stored at ^testglobal(subscript)
write !, "subscript=", subscript, ", value=", ^testglobal(subscript)
}
}
请注意,"无参数(argumentless) "的 for 循环没有指定终止条件,如果我们不显式退出该循环,它将永远循环下去。Write 语句中的感叹号告诉 ObjectScript 在编写 global 中每个节点的下标和值之前移动到下一行。
要在终端(Terminal)运行该方法,请输入:
USER>do ##class(FirstLook.ObjectScript).Iterate()
这产生了输出:
subscript=1, value=8888 subscript=2, value=9999
ObjectScript 和 Objects
您可以使用 ObjectScript 来创建具有方法和属性的类。然后您可以将该类的 objects 实例化。示例类 FirstLook.Person.cls 定义了一个类 Person,然后让您创建该类的实例,如 person John Smith 或 person Jane Doe。
基本的类定义如下所示:
Class FirstLook.Person Extends %Persistent
{
Property FirstName As %String [ Required ]; Property LastName As %String [ Required ];
}
Person 类扩展了内置的 InterSystems IRIS 类 %Persistent,它允许您访问父类中一些有用的方法,如 %New() 和 %Save()。 然后列出该类的属性。在这种情况下,您只是了存储一个 person 的名字和姓氏。
继续使用 终端(Terminal)创建一个新 person。如果您不在 USER 命名空间,执行以下命令:
set $namespace = "USER"
要创建一个新的 Person object,请使用 %New() 方法,该方法返回一个新 person 的 "句柄",更正式的说法是一个 object 引用,或 OREF。然后设置新 person 的属性,并调用 %Save() 方法将新 person 存储在数据库中。
USER>set person = ##class(FirstLook.Person).%New() USER>set person.FirstName = "Sarah"
USER>set person.LastName = "Aarons" USER>set status = person.%Save()
USER>write status 1
试一试: 使用 ObjectScript 存储和检索数据
%Save() 方法返回一个状态,如果成功的话,其值为 1。
当您保存一个 object 时,InterSystems IRIS 会自动为您把它储存在一个 global 中。默认的 global 名称是末尾带有 Dappended 的类名,在本例中是 ^FirstLook.PersonD。
如果显示 global 的内容,您可以看到根节点(没有下标的节点)持有一个 ID,这个 ID 对存储的每个新对象来说是递增的。Global 的其余部分由 ID 下标。每个 Person 节点包含一个属性值列表,其中列表用 $lb 表示,用于 "列表构建"。
USER>zwrite ^FirstLook.PersonD
^FirstLook.PersonD=1
^FirstLook.PersonD(1)=$lb("","Sarah","Aarons")
您还可以定义实例方法,它对特定的实例进行操作,而类方法则是类的泛型方法。例如, FirstLook.Person.cls 包含一个 WriteName() 方法, 该方法编写 person 的名字。
/// Given an instance of a person, write person's name Method WriteName() {
write "The name of this person is:" write !, ..FirstName
write !, ..LastName
}
属性或方法名称前面的额外点表示当前对象或类。
由于变量 person 目前指的是 Sarah Aarons,您可以这样写她的名字:
USER>do person.WriteName() The name of this person is:
Sarah Aarons
作为练习,创建、存储和编写 Person 类的一些新对象,例如,Andrew Shaw、Peter Shaw 和 Kate Aarons。
ObjectScript 和 SQL
您刚刚已经看到了如何将创建的每个 person 存储为 global 中的节点。正如您将在本节中所看到的,每个 person 也是表中的一行,可以使用 SQL 进行访问。
InterSystems 提供了几种在 ObjectScript 中使用 SQL 的方法。例如,您可以使用类查询,这基本上是类文件中的 SQL 查询。
在 FirstLook.Person.cls 中,下面的类查询,对类中的所有对象执行 SELECT 命令:
/// Query for all stored names
Query Select() As %SQLQuery [SqlProc]
{
SELECT %ID, FirstName, LastName FROM Person
ORDER By LastName, FirstName
}
要测试该查询,您可以从终端(Terminal)运行它:
USER>do ##class(%ResultSet).RunQuery("FirstLook.Person", "Select")
输出将显示一个列表,其中包含您在前面的练习中创建并存储的每个 person,按姓氏,然后是名字排序:
ID:FirstName:LastName:
4:Kate:Aarons:
1:Sarah:Aarons:
2:Andrew:Shaw:
3:Peter:Shaw:
了解有关 ObjectScript 的更多信息
在实际生活中,您可能会编写一个类方法,比如 FirstLook.Person.cls 中为您提供的方法,将查询的结果放在结果集中,然后遍历这个结果集中的每一行:
/// Run select query and write all names in result set ClassMethod WriteAllNames()
{
// Create a new %SQL.Statement object
set stmt = ##class(%SQL.Statement).%New()
// Prepare the class query to execute by passing in
// the ClassName and QueryName.
set status = stmt.%PrepareClassQuery("FirstLook.Person", "Select")
// Handle any errors if $$$ISERR(status) {
do $system.OBJ.DisplayError(status) quit
}
// Execute the query
set resultSet = stmt.%Execute()
// Iterate over results while (resultSet.%Next()) {
// Write person's first and last name
write !, resultSet.%Get("FirstName"), " ", resultSet.%Get("LastName")
}
}
在调用 %PrepareClassQuery() 后,这个类方法使用 $$$ISERRmacro 来检查错误状态。然后, 在执行查询后,代码使用 resultSet.%Next() 循环遍历结果集,如果存在另一行,则返回 true。
要在终端(Terminal)运行该方法,请输入:
USER>do ##class(FirstLook.Person).WriteAllNames() Kate Aarons
Sarah Aarons Andrew Shaw Peter Shaw
正如您所看到的,ObjectScript 为您提供了几个处理数据的选项。使用 globals 可以最大限度地控制数据的存储方式,使用 objects 可以轻松地处理类的单个实例,而 SQL 可以跨表的行进行操作。如何看待数据完全取决于您自己。
了解有关 ObjectScript 的更多信息
使用下面列出的参考资料,了解更多关于 ObjectScript 编程的知识。
ObjectScript 教程 --- 提供 ObjectScript 语言的交互式介绍。
Using ObjectScript(使用 ObjectScript)--- 提供 ObjectScript 编程语言的概述和详细信息。
ObjectScript Reference(ObjectScript 参考资料) --- 提供 ObjectScript 的参考资料。
Orientation Guide for Server-Side Programming(服务器端编程定向指南) --- 为使用 InterSystems 产品编写服务器端代码的程序员提供基本信息。
InterSystems ObjectScript Basics(InterSystems ObjectScript 基础) --- 涵盖 ObjectScript 基础的交互式课程。
公告
Claire Zheng · 八月 22, 2022
亲爱的开发者们!
到了展示互操作性技术的时候了!来参加我们最新的竞赛吧!
🏆 InterSystems开发者大赛:以互操作性技术为可持续发展构建解决方案 🏆
时间: 8月29日-9月19日(北京时间)
奖金更高: $13,500 – 请留意,奖金分配跟以往有所不同!
主题
💡 基于InterSystems IRIS和InterSystems IRIS医疗版的互操作性解决方案 💡
基于InterSystems IRIS数据平台或InterSystems IRIS医疗版开发互操作性解决方案,或为开发/维护互操作性解决方案提供帮助的解决方案。
此外,我们邀请开发者尝试解决一个全球性问题,这次我们提出的是“可持续发展问题”。
我们鼓励您参与此次竞赛,构建旨在解决可持续发展问题的解决方案:
1) 如果您的应用对解决可持续发展问题、ESC、可替代能源、最佳利用等问题有帮助,您将获得特别奖励。2) 如果您准备并提交了一个与可持续发展、ESG、可替代能源、最佳利用等问题相关的数据集,您将获得更多额外奖励。
基本要求
有效应用程序:100%全新的Open Exchange Apps或已有的应用程序(但有显著提升)。所有参赛者/团队提交的应用程序只有经过我们团队的审核之后才会被批准参赛。
该应用可以在 IRIS Community Edition or IRIS for Health Community Edition or IRIS Advanced Analytics Community Edition上运行。
该应用需开源并在GitHub上发布。
该应用的README文件应为英文,包含安装步骤,并包含视频demo或/和应用程序如何运行的描述。
🆕 奖品:
如您所愿!我们这次提高了奖金,优化了奖金分配机制!
1. 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出:
🥇 第1名 - $5,000
🥈 第2名 - $3,000
🥉 第3名 - $1,500
🏅 第4名 - $750
🏅 第5名 - $500
🌟 第6-10名 - $100
2. 社区提名奖(Community Nomination)- 获得总投票数最多的应用:
🥇 第1名 - $1,000
🥈 第2名 - $750
🥉 第3名 - $500
✨ 所有获奖者都将获得Global Masters徽章!
注意:如果同时多位参赛者获得同样的票数,均被视为优胜者,将平分奖金
关键参赛节
🛠 应用开发、提交阶段
2022年8月29日 (12:00PM 北京时间):竞赛启动。
2022年9月12日 (11:59AM 北京时间):提交截止。
✅ 投票阶段
2022年9月12日 (12:00PM 北京时间): 投票开始。
2022年9月19日 (11:59AM 北京时间): 投票结束。
注意:在整个参赛期间(开发与投票期间),开发者可持续提升其应用
谁可以参加?
任何开发者社区的成员均可参加,InterSystems内部员工除外(InterSystems contractor员工可以参加)。还没有账号?现在来建一个!
👥 开发者可以组团 创建一个协作应用程序,组团限定人数为2-5人。
请注意,要在您的README文件中标注您的团队成员——社区用户profile
资源助力:
✓ 示例应用:
interoperability-embedded-python
IRIS-Interoperability-template
ETL-Interoperability-Adapter
HL7 and SMS Interoperability Demo
UnitTest DTL HL7
Twitter Sentiment Analysis with IRIS
Healthcare HL7 XML
RabbitMQ adapter
PEX demo
✓ 在线课程:
Interoperability for Business
Interoperability QuickStart
Interoperability Resource Guide - 2019
✓ 视频:
Intelligent Interoperability
Interoperability for Health Overview
✓ IRIS初学者:
Build a Server-Side Application with InterSystems IRIS
Learning Path for beginners
✓ ObjectScript Package Manager (ZPM) 初学者:
How to Build, Test and Publish ZPM Package with REST Application for InterSystems IRIS
Package First Development Approach with InterSystems IRIS and ZPM
✓ 如何将您的APP提交给大赛:
如何在InterSystems Open Exchange上发布应用程序
如何把参赛APP提交给大赛
需要帮助?
加入InterSystems的 Discord server频道,或跟帖评论提出您的问题!
期待您的精彩提交!祝好运 👍
参与此次竞赛,您同意 遵守相关条款,请认真阅读。
文章
Claire Zheng · 五月 9, 2023
2023年4月,InterSystems亚太区总经理老卢(Luciano Brustia)回到了阔别三年多的北京,针对一些热门问题分享了自己的观点:北京在疫情前后有什么不同?InterSystems是如何进行本土化创新服务中国市场的?与其他亚太国家相比,中国医疗信息化发展有什么特色?医疗信息化未来的发展方向和趋势是什么?
文章
Jingwei Wang · 六月 8, 2023
在InterSystems IRIS中重新加载更新后的Python模块的方式和直接使用Python 重新加载模块的方式是一样的。
在Python3.4 之后到版本中,直接使用Python 重新加载模块的方式如下:
import importlib
importlib.reload(module)
同样,在在InterSystems IRIS中重新加载Python模块的方式与其没有区别,示例如下:
ClassMethod Hello() As %Status
{
Set sc = $$$OK
Set sm = ##class(%SYS.Python).Import("sample")
Set importlib = ##class(%SYS.Python).Import("importlib")
do importlib.reload(sm)
write sm.hello()
Return sc
}
公告
Johnny Wang · 九月 2, 2021
2021 年 8 月的学习资料现在可以在learning.intersystems.com上独家获取!您可以:
先睹为快:2021 年虚拟峰会体验实验室
使用自适应分析(Adaptive Analytics)解决方案来组建你的第一个数据模型
免费试用 InterSystems IRIS 社区版
查看 InterSystems 文档中的分析
申请即将举行的线上技术课程
立刻报名!
注意:老是错过最新消息?别担心,我们会在9月恢复正常的邮件发送。
文章
Qiao Peng · 三月 29, 2021
InterSystems IRIS/Caché的CDC
InterSystems IRIS/Caché未提供开箱即用的变更数据捕获(CDC)工具,而且由于其多模型建模能力和底层的多维存储模型,相对于关系型数据库的单一模型,针对于SQL的CDC在InterSystems IRIS/Caché上会更复杂一些。例如通过Journal日志记录的是底层持久化多维数组的数据变更,而不是SQL table的变更。
通常,在应用层面实现变更数据捕获是更灵活和简单的方式,例如通过设置触发器、类的DSTIME参数。但如果无法在应用层做CDC,可以考虑使用InterSystems IRIS/Caché的Journal和强大的开发能力获取数据变更。
这里介绍使用InterSystems IRIS/Caché的Reporting类型的异步镜像成员获取数据变更。
Dejournal 过滤器
InterSystems IRIS/Caché的 Dejournal 过滤器用于在Reporting类型的异步镜像成员上过滤Journal记录。当配置了Dejournal 过滤器后,异步镜像成员在redo journal前会自动调用Dejournal过滤器类的方法RunFilter,并传入以下参数: 1. MirrorDBName:镜像数据库名称; 2. GlobalReference:Global节点(包括下标); 3. RecordType:操作类型,为S(Set)和K(Kill); 4. Address:Journal记录在Journal文件中的偏移量。
我们可以利用自定义的Dejournal过滤器,捕获持久化多维数组(Global)的数据变化,并输出给外部系统。
注意:1. 如果仅为实现CDC,并不需要配置镜像备机。2. Dejournal过滤器只能配置在Reporting类型的异步镜像成员上。3. 镜像配置不在本文内容里,请参考文档:[IRIS] https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GHA_mirror[Caché] https://cedocs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GHA_mirror
编写Dejournal过滤器
InterSystems IRIS/Caché提供镜像Dejournal系统类 - SYS.MirrorDejournal。对于用户自定义过滤逻辑,通过继承于SYS.MirrorDejournal的子类来实现。
在Reporting异步镜像成员的%SYS命名空间(IRISLIB数据库)下创建SYS.MirrorDejournal的子类,命名应以Z或z开头,以避免升级时被覆盖,例如命名为ZCustom.MirrorDejournal。注意: IRISLIB数据库默认是只读的,需要先将其修改为可读写。
Override该类的RunFilter方法,将数据变更捕获的逻辑放在该方法里,并根据需要返回1或0。1代表这个global变更需要dejournal,0代表不需要。即便仅仅是为实现CDC,建议在Reporting异步镜像成员恢复所有数据,即让该方法返回1,从而不需要影响生产系统,直接从Reporting异步镜像成员上获取所有的变更数据。
例如,将global的数据变更记录在^CDCLog中:
Class ZCustom.MirrorDejournal Extends SYS.MirrorDejournal
{
Method RunFilter(
MirrorDBName As %String,
GlobalReference As %String,
RecordType As %String,
Address As %Integer) As %Integer
{
Set ^CDCLog( $$I ($^CDCLog))=$lb(MirrorDBName,GlobalReference,RecordType,Address)
Quit 1
}
}
配置Dejournal过滤器
在Reporting异步镜像成员上,配置其镜像Dejournal过滤器为上面创建的过滤器类的名称。
后记
今天有人问到,如何获取变更的值和变更前的值。可以使用`$$$JRNNEWVAL(Address) 、$$$JRNOLDVAL(Address)`在上面的RunFilter方法中获取变更后和变更前的数据。注意,`$$$JRNNEWVAL(Address) 、$$$JRNOLDVAL(Address)`这2个宏定义在%syJrnRecord.inc文件里,因此需要将这个include文件加入ZCustom.MirrorDejournal类定义:Include %syJrnRecord
又,在InterSystems IRIS上修改并编译dejournal过滤器类后,需要重启异步镜像成员的Mirror,以使更改生效。
CDC系列
更多的CDC选项实现,请参考:
1. CDC系列之一 :使用Dejournal Filter在InterSystems IRIS/Caché上通过Mirroring实现CDC功能
2. CDC系列之二 :使用Dejournaling filter routine在Caché上通过Shadow实现CDC
3. CDC系列之三 :建立InterSystems IRIS/Caché的Global数据变更与SQL表记录的对应关系
4. CDC系列之四:使用DSTIME特性在InterSystems IRIS/Caché上实现CDC功能
很好的文章 学习一下
公告
Claire Zheng · 九月 23, 2022
亲爱的社区同学们!
2022年9月5日-10月24日,我们正在举办InterSystems开发者社区中文版首届技术征文大赛!
🏆InterSystems开发者社区中文版首届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)!
2022年9月27日(下周二)11:00-11:30,我们将进行一次针对此次征文大赛的线上宣讲,欢迎您通过腾讯会议参加,了解关于此次征文大赛的信息,针对感兴趣的问题提问。
#腾讯会议信息
会议主题:InterSystems 社区技术征文大赛宣讲&解读会议时间:2022/09/27 11:00-11:30 (GMT+08:00) 中国标准时间 - 北京
点击链接入会,或添加至会议列表:https://meeting.tencent.com/dm/4UEzyh467wae
#腾讯会议:493-643-076