文章
王喆 · 九月 13 阅读大约需 4 分钟

IRIS快速查询服务思路分享

背景

作为集成平台厂商,在医院同其它系统联调的时候所做的事情中,多的不是开发代码而是查消息。我先演示一下目前我正在使用的IRIS查消息的方式:

例子1:

需要看【个人信息注册服务】

我只需要在框中输入【个人信息注册】回车

点击【查看消息】,显示的是消息里面的内容,如图所示:

点击【查看流程】,显示的是IRIS消息可视化的页面,如图所示:

例子2:

    需要查询患者ID为【2874621】这患者在集成平台调用了哪些服务

    我只需要选择下拉选择【患者ID】,然后输入【2874621】,回车

   

这个是我们以用户需求的角度直观的查询到指定的消息,IRIS也有这个功能—消息查看器,它是如何使用的呢?首先,我们得知道这条消息使用了哪些Production组件,其次我们需要了解这个消息使用的实体类的结构。比如同样查这个人的消息,我需要输入request.Body.PatientID=“2874621”,选择消息类。如果我需要查多个服务的我还需要多选消息类 …… 本文不是来介绍如何使用消息查看器的,各位大概知道就好。

 

程序分析与设计思路

    原始消息查看器的使用

我们先使用IRIS自带的【消息查看器】查患者ID为【2874621】个人信息注册服务,如图所示:

    选时间,输入图中所示的条件去检索。步骤上好像也挺简单的,但是这里有两个前提条件,一是我得知道每个服务对应的消息类是哪个。二是我知道这个消息类里面患者ID对应的字段是哪个,而且这个字段不能在循环里面(好像说了3个条件 ~ 哈哈),如何处理摆在了我们的眼前。

 

    SQL分析

    使用IRIS自带的【显示查询】功能(这个如何开启使用可以看我的另外一篇文章 https://cn.community.intersystems.com/node/525741 ),如图所示:

    找个位置格式化一下:

可以看到从这段SQL可以看出3点:

(1)IRIS消息记录的表是【Ens.MessageHeader】

(2)IRIS保存消息是给实体本身建立了一个表 比如上述的例子:

【BKIP_PatientInfo_MSG.PatientInfoRegister】

(3)head.MessageBodyId = BKIP_PatientInfo_MSG.PatientInfoRegister.%ID

通过这3条,我们可以得到下面这张图的信息:

    倘若我们把SQL按照如上图所示的方式处理,然后反应在页面上供用户选择;患者ID也由用户选择或者输入;这样确实直观的解决了。但是,效率,上述消息查看器在用户选择时间的时候首先查到两个ID让查询就在这两个主键ID之间查找,增加了效率,我们当然可以使用。那么它是必须的么,去掉的话我们速度一定变慢?这是其一。第二点,如果患者ID是在循环中,甚至是在循环的循环中…… 消息查看器好像就没办法了(当然如果有大佬可以解决请接受我的膝盖)。

    需要解决的问题

  1. 对照表,服务和消息类的对照表
  2. 如何把循环中的字段作为关键字进行查询

第一个问题就是解决方案,新建一张表维护服务和消息类的关系,第二个问题:我们要去看一下Ens.MessageHeader这张表:

    好像看不出什么。。。

    大家可以看看这个图

    在图中红框框住的部分是一样的,同时我们进入消息可视化,如图:

我们可以不可以说这个会话ID就是代表了这个服务的这条消息呢?我们要查指定服务的指定人的消息可以理解为查这个会话ID也就是SessionID。我们把思路换一下,如果我把循环中的患者ID遍历出来存入一张表中,这一行的数据我有sessionID、患者ID、服务名。当我想查患者ID为【2874621】的个人信息注册服务得到sessionID之后,直接跳到可视化追踪,如果把患者ID换成医嘱ID也是一样的处理,其它关键字段也是一样,问题是不是迎刃而解?

    程序设计(思路)

    新建一个索引表 字段为 SessionID、服务名、属性名、属性值、创建时间,如图所示:

    然后在每次服务被调用的时候取出我们需要的属性名、属性值和SessionID存入这张表中,如图所示:

我们在页面上进行查询的时候只需要编写如图所示的SQL,省略号代表and后面的条件。

后续的REST接口和前端的页面在此就【略】,大家可以参考我的另外一篇文章提供的思路编写提供出来Restful接口(https://cn.community.intersystems.com/node/525561 )

总结

       总的来说,我们思路是我们把原本数据量变小,把原本的多重循环的问题维护在一张单表的多行数据中去。这样把原本的多表联合查询改成了单表查询。这速度不快的飞起?目前这边只做思路分享,相信程序设计上大家肯定有自己的一套方式,我这边暂时不做过多展示。都看到这里了,给我点一个赞吧!!!

20
0 76
讨论 (3)3
登录或注册以继续

可以考虑使用ElasticSearch做全文搜索

是的,用ES是最好的。但是ES中有一个很重要的概念叫倒排索引,就是拆分词语存入倒排索引的库,方便在检索的时候分析,和我这边的把一个消息关键字段拆分成索引去检索是否有一点异曲同工捏。当然还是那句话ES是最好的,只不过我这边不需要那么高性能,而且也没试过IRIS结合ES去使用,这里只做分享哈。

还可以考虑用iknow(现在叫InterSystems NLP)实现全文检索