我们现在就是Redis

了解更多

建立医疗保健提供者

学习如何使用Redis的地理空间功能建立一个简单的医疗保健提供者查找器——不需要复杂的数学!



回到博客

对于患者来说,在医疗领域中导航可能会令人困惑。术语和选项通常不熟悉,甚至很难弄清楚如何开始。一个“商店搜寻者”该功能通常出现在零售网站上,可以帮助您根据邮政编码或邮政编码找到附近的医生或其他医疗保健提供者。

然而,不幸的是,创建这个功能并不总是那么容易。我们生活在一个球体上,如果我们想要找到任意方向上给定距离内的位置,我们必须将一个圆投射到一个球面上并且使用一个不是完全直接的坐标系。所有这些都相当于不那么简单的数学。值得庆幸的是,Redis拥有广泛的地理空间功能,可以帮助你构建这种类型的功能。

在这个问题上,我们要回答的最基本的问题非常简单:“我附近有哪些医疗保健提供者?”为此,您需要医疗保健提供者的列表、提供者在经纬度中的位置以及询问问题的患者的位置。提供程序列表如下所示:

这只是一个演示的小列表,但在Redis中,这个列表可能非常大,仅受可用内存数量的限制。

找到病人的位置有很多方法:反向IP、邮政编码匹配(称为geocoder),甚至是GPS设备。每个方法都有优缺点,以及超出本文范围的具体实现细节。但是,无论使用何种方法,它们都将解析为纬度和经度。我们现在假设位置是53.5469,-113.4977。

将数据输入Redis可以是一次性的,也可以随着提供商列表的变化定期更新地理添加命令将一个位置添加到称为地理集.Geosets是Sorted Set的变体,它将经度和纬度编码到GeoHash中,并存储在Sorted Set成员的分数中。让我们看看它是什么样的:

> GEOADD providers -113.4967 53.5574
(整数)1
>GEOADD提供者-113.5313 53.5177交叉癌症研究所
(整数)1
> GEOADD供应商-113.4283 53.4608灰修女社区医院
(整数)1
> GEOADD providers -113.5247 53.5205 university of alberta-hospital
(整数)1
>GEOADD提供者-113.6119 53.5207米塞里科迪亚社区医院
(整数)1

在这个例子中值得注意的是参数。第一个论点是关键,在Redis中很典型。第二个参数是经度,第三个参数是纬度,最后一个参数是成员。(非常重要的一点是,经度和纬度的顺序可能与你习惯看到的相反。)

现在我们有了我们的数据在系统中,每当用户想要找到一个供应商,我们只需要运行一个单一的Redis命令来找到他们附近的位置:

> GEORADIUS供应商-113.4977 53.5469 5 km

第一个参数是前面的同一个键,第二个和第三个参数分别是用户的经度和纬度。第四个和第五个参数是距离和单位(公里公里,心肌梗死数英里,F对于脚和脚,M米)。输出如下所示:

1) “皇家亚历克斯”
2)“university-of-alberta-hospital”
3)“cross-cancer-institute”

地理空间的附加功能

上面的例子可以让患者找到离他们最近的医疗机构,但是如果他们想找一家提供特定服务的医疗机构怎么办?如果他们需要一个提供不止一种特产的设施怎么办?Redis也可以提供帮助。

我们将使用RediSearch模块。reresearch具有更丰富的数据查询能力,但保留了GEO系列命令的地理空间能力。然而,这些更丰富的功能要求我们首先创建一个模式。

>创建FT_提供者架构名称文本服务标记位置地理位置

这将创建一个名为ft_providers有三个字段:名称,服务,地方名称是一个文本字段,所以它可以容纳人类语言;服务是一个标记字段,其中包含表示所提供服务的标记;最后地方保存位置的纬度和经度。

现在,让我们将位置添加到索引中。我们将使用FT.ADD命令,该命令要求索引后跟文档ID以唯一标识文档,然后是文档分数。在此之后模式保留字将选项与文档的字段分隔开来,字段的名称、值顺序跟在后面。让我们来看看:

> FT.ADD ft_providers Royal - Alex 1.0 FIELDS name "Royal Alex Hospital" services "肾脏诊所,足诊所,胃镜,老年病学,重症,整形外科,超声波" location "-113.4967 53.5574" OK > FT.ADD ft_providers Cross - Cancer Institute" services“超声波透视,核磁共振,乳房x光检查,physicaltherapy, tumourtriage”位置“-113.5313 - 53.5177”好> FT.ADD ft_providers grey-nuns-community-hospital 1.0字段名称“灰色修女社区医院”服务“respiratorytherapy,整形外科,nucelarmedicine labouranddelivery,透视,intensivecare”位置“-113.4283 - 53.4608”好> FT.ADDft_providers Misericordia - Community - Hospital 1.0 FIELDS name "Misericordia Community Hospital" services "结肠镜检查,重症检查,核医学,呼吸治疗,胃镜" location "-113.5247 53.5205" OK > FT.ADD ft_providers Misericordia - Community - Hospital" services骨科,老年病学,足部诊所,超声波,分娩"位置"-113.6119 53.5207"好的


一旦我们有了reresearch的数据,我们就可以开始搜索设施了。在reresearchch中,我们使用一个命令叫做FT.SEARCH. 第一个参数是要搜索的索引,第二个参数是查询. 在重新搜索中,指定一个查询,该查询将确定返回给您的结果。查询可以非常简单,也可以非常复杂,但与其他一些数据库不同,查询从不执行任何管理或破坏性操作。

假设您希望在上面使用的示例位置附近找到提供商,但仅限于提供超声服务的提供商。在重新搜索中,查询如下所示:

>FT.SEARCH FT_提供者“@location:[-113.4967 53.5574 5 km]@services:{超声波}”1(整数)2)“交叉癌症研究所”3)“名称”2)“交叉癌症研究所”3“location”4)”-113.5313 53.5177“5”服务“6)”超声波、荧光透视、mri、乳房X光检查、物理治疗、肿瘤“4”皇家亚历克斯“5”1)“名称”2“皇家亚历克斯医院”3)“位置”4)“113.4967 53.5574”5)“服务”6)“肾脏诊所、足部诊所、胃镜检查、老年医学、重症监护、整形外科、超声”


这个@RedSearch中的符号表示“在特定字段中搜索”。查询的第一部分是对名为的地理空间字段的搜索子句地方. 您会注意到,方括号之间的参数与您在乔拉迪乌斯命令:经度,纬度,搜索半径和单位。第二个@符号后面跟着字段名服务,也就是说我们在每个文档的服务字段中搜索。用花括号括起来的是字段中必须包含的标记的名称。在本例中,我们正在寻找包含标签的文档超声波. 在RedSearch中,location和services搜索子句之间有一个空格,这是一个隐式的和非隐式的。

在构建UI时,可以将不同的用户输入组合到同一个查询中,以细化结果。以下是它如何工作的草图:

从应用程序的角度来看,UI元素是字符串的表示形式,当它们更改模板时,您可以将它们转换为传递给的字符串FT.SEARCH.SQL查询等内容中的字符串插值是有风险的(请参阅小的波比桌子),这是由于SQL语言中的管理操作。相比之下,reresearch查询只能查找文档,而不能执行管理操作,因此只需要简单的输入验证和完整性检查。

如果用户同时检查这两个选项,则会增加搜索的复杂性超声波老年医学,您将更改服务子句通过插入管道将两者都包括在内(|)在两个标记之间,如下所示:

> FT.SEARCH ft_providers "@location:[-113.4967 53.5574 5 km] @services:{超声|geriatrics}" 1)(整数)2 2)“royal-alex”3)1)“名称”2)“皇家亚历克斯医院”“位置”4)“-113.4967 - 53.5574 5)“服务”6)“kidneyclinic footclinic,胃镜检查、老年病学intensivecare, plasticsurgery,超声波“4)“cross-cancer-institute”5)1)“名称”2) "Cross Cancer Institute" 3) "location" 4) "-113.5313 53.5177" 5) "services" 6) "ultrasound,fluoroscopy,mri,mammography,physicaltherapy,tumourtriage"


RedSearch足够灵活,可以处理这类应用程序中实际需要的任何其他功能。名称和名称前缀搜索、声音相似名称和街道名称等操作都只是此类查询的增量步骤。例如,您可以通过在模式中包含一个数字字段来添加一个很酷的等待时间功能,因为RediSearch是一个实时搜索引擎,可以快速更新此值,因此试图找到等待时间最短的提供者的患者将始终获得最新结果。

只需几行代码,Redis就可以帮助你构建一个简单的医疗保健提供商查找器,而RediSearch实际上可以填写你可能需要的任何功能,这样患者就可以找到满足他们需求的提供商。因为Redis和reresearch有内置的地理空间功能,你不需要做任何数学运算。reresearch为您提供了丰富的查询功能,可以安全地接受来自患者的输入,并能够实时更新,这意味着您可以在不向患者提供过时信息的情况下进行更改。

Baidu