ES数据库
ES数据库
更新时间:2024-04-29 09:42:32

文档
属性·动作·事件

该功能暂时仅针对系统整体部署企业用户开放

功能概述

ES数据库,即elastic search数据库,是一种专门用来做全文搜索的分布式数据库,也是当前市面上同类数据库中使用最广的一个数据库软件。其主要功能是将数据进行分词索引,并当用户输入一个查询语句时,对查询语句进行分词,在现有的数据分词库中进行匹配查询,并返回匹配程度最高的数据记录。因此,和普通的mysql数据库(在ivx中,底层可以对接mysql、mariaDB、postgresql、sqlserver等,我们在这里统称mysql数据库)不同,我们可以利用ES数据库来实现全文搜索,模糊查询等等功能,ES的分词索引与分布式计算结构,可以非常快速的对用户的查询进行返回,而不是像普通的mysql数据库那样需要用“包含”这种效率极低的数据遍历查询。

由于ES数据库在设计时的目的就是做全文搜索,因此其底层实现和mysql数据库有很大的不同,我们在这里简要列举一下,请大家根据具体的使用场景来决定使用哪一种数据库(或结合使用两种数据库):

  1. ES数据库,使用了反向索引系统(下一节中我们将详细介绍),因此,其对数据的存储的消耗以及计算服务的消耗会相对mysql数据库明显的增加,因此,我们尽量不要将大段大段的文本存入ES数据库并进行分词索引,而是仅将重要关键的信息进行分词索引;
  2. ES数据库不支持事务,因此,我们的核心业务逻辑,还是要依赖mysql数据库,仅仅是将全文搜索的部分,使用ES数据库。我们可以通过数据ID进行关联,用ES数据库找到相应的数据ID之后,再从mysql数据库中进行输出/更新等操作;
  3. ES数据库不支持联合索引;
  4. ES数据库,也支持添加的索引的纯数据类型的字段,同时,也支持所有筛选、排序操作,和mysql数据库一致,因此,如果我们只是存储一些文章、商品附加信息等数据,可以仅使用ES数据库实现。
  5. 由于ES数据库需要对数据进行“分词预处理”,因此,iVX编辑器中暂时不支持批量导入ES数据,因为其后台计算消耗可能过大,且中途可能出现错误。


反向索引的原理

ES数据库的核心原理就是反向索引(inverted index),其操作即把数据库里的某个字段里的文本信息,进行分词,然后该字段中的所有数据的分词,统一标记。比如,我们有一个字段叫“菜品名称”,里面有3条数据:

  • 数据1:牛肉粉丝煲
  • 数据2:海鲜粉丝煲
  • 数据3:牛肉芝士披萨


由于我们给这个“菜品名称”字段添加了分词索引,ES数据库会分别针对每一条数据,进行分词,分词的结果大概是这样:

  • 数据1:牛肉(0),粉丝(1),煲(2)
  • 数据2:海鲜(0),粉丝(1),煲(2)
  • 数据3:牛肉(0),芝士(1),披萨(2)


分词索引,除了会记录每条数据的分词,还会记录这些词的位置,用来做之后一些高级的搜索,比如,我们可以指定搜索时,两个分词必须连在一起。

分词完毕后,这个数据库就可以处理用户的搜索请求了,比如,当用户要求查询 “牛肉披萨”时,系统会先将其分词为“牛肉”和“披萨”,然后在每条数据记录里查询,会得到这个结果:



在以上例子中,数据1中有一个分词命中,数据2没有命中,数据3有两个分词命中,因此,在默认的查询条件下,ES会返回数据3和数据1,数据3会排在数据1的前面,因为其的匹配度更高。

以上,只是一个非常简单的例子,仅用来说明ES的搜索原理。在具体的实现中,ES的搜索匹配算法要复杂很多,也可以添加额外的筛选和排序条件,我们在之后的章节中会专门来讲。



添加与设置字段

接下来,我们来正式开始使用iVX中的ES数据库组件。首先,我们添加一个ES数据库,添加的方法和mysql数据库完全一致,也根据数据库的操作权限范围,分为案例级别的数据库、组应用级别的数据库以及账号/企业级别的数据库。

添加ES数据库之后,我们选中它,可以看到和mysql数据库类似的界面,然后,我们选择添加字段:



添加字段时,除了选择字段类型与设置字段名称,我们还需要选择索引的类型。这个就是ES数据库和mysql数据库最大的区别之一了,在mysql数据库中,索引和数据是相对分离的,因此,我们在一个单独的索引面板来设置索引,且设置之后,可以添加和调整;但对于ES数据库,数据和索引其实是一体的,我们在上一节反向索引的原理中已经了解到,每场次新插入数据,如果该字段设置了分词索引,则插入的数据会自动根据当前分词索引进行分词拆分,因此,最终数据存储的方式,和索引的方式是密切相关的。换一句话来说,在ES数据库中,索引和数据是一体的,而在mysql数据库中,索引和数据是相对独立的。

因此,在ES数据库中,如果我们修改了索引的方式,比如,之前是中文分词,现在改成英文分词,那需要对整个表中的数据进行重新拆分处理,即“全表重新索引”(reindex)这个操作的成本非常高,且在重新索引的过程中,ES数据库会出现数据不一致的情况。因此,在iVX中,我们没有提供修改索引的功能,建议大家在设置索引时就确认好当前字段的索引类型,万一一定要要修改索引方法,可以删除字段之后重新添加。

接下来,我们来详细说明一下字段设置中4个索引选项的意义:

  • 无索引:并不是索引的字段都需要添加索引,ES数据库也可以存储一些不需要作为搜索条件的信息,比如,商品的图片,候选人的视频等等,这些信息不是文本信息,无法作为搜索条件,但它们可以作为附加信息存储在ES数据库中,当我们搜索其他索引自动时,返回额外的信息。无索引的字段,可以在创建之后再添加索引,只需要点击字段名称添加即可:




  • 中文分词与英文分词:这两个都是分词索引,即ES数据库的“精髓”,会自动针对所有该字段下的数据,进行分词存储。中文分词和英文分词,只是两个不同的分词器,建议针对两种语言的数据来选择。注意,只有文本类型的字段,才能选择分词索引,且分词索引一旦选择之后,就无法再修改了。
  • 精确索引:精确索引,类似是mysql数据库中的索引,这种索引,除了文本类型的字段,其他类型的字段也可以设置。精确索引的字段,系统不会对内部数据进行分词,而是针对完整的数据内容进行索引,主要用来做筛选、排序操作。比如,我们可以为一个数值字段“价格”添加精确索引,在用户搜索某个商品时,针对商品名称进行全文搜索,但额外添加一个价格区间的筛选条件,仅返回在指定价格区间内的数据。注意,在ES数据库中,没有添加精确索引的字段,是无法作为筛选/排序条件的,这个和mysql数据库不同,mysql数据库中,即使没有索引,也可以针对某个字段进行筛选,只是没有索引时筛选会相对有索引时慢而已,但ES数据库是无法对没有索引的字段进行筛选的。最后,再次强调一下,和分词索引一样,一旦添加了精确索引,就无法再修改索引类型了。





添加数据

如上文所说,iVX目前不支持直接向ES数据库中批量导入数据,因此,我们目前有两种方法可以向ES数据库中添加数据,一是直接在编辑器里添加,这个操作和mysql数据库完全一致,二是在运行时通过ES数据库的“提交”与“提交多条数据”动作来添加数据:



两个动作的使用方法和mysql数据库基本一致,提交多条数据,也是限制为1000条以内。但ES数据库的提交有一个地方与mysql不一样,即我们在提交的时候可以指定数据ID。比如,我们新建了一个ES数据库,有以下字段:



当我们选择提交动作的时候,可以发现数据ID也是可以指定的:



在mysql数据库中,我们只能向自定义字段中提交数据,因为数据ID是一个自增的数值。而ES数据库,我们可以选择在提交数据时,指定数据ID。利用这个功能,我们可以把ES数据库和mysql数据库进行关联,即同时使用mysql数据库和ES数据库的时候,我们可以先向mysql数据库中提交数据,然后利用返回的数据ID,再向ES数据库中提交。这样,当我们用ES数据库进行全文搜索之后,可以直接用返回的数据ID去mysql数据里进行额外的业务操作。

当然,如果我们不填数据ID,系统会自动生成。注意,系统自动生成的数据ID默认是一个独立唯一的字符串:



最后,尽管我们可以在提交数据时指定数据ID,但无法修改已经提交的数据ID,因此在更新操作时,无法选择数据ID作为更新字段。

全文搜索

进行全文搜索的范围,只能是在数据库中设置了分词索引的字段上,

全文搜索动作中,搜索内容参数下,输入的就是需要进行全文搜索的内容
在高级搜索条件下,可以在数据库中所有设置了分词索引的字段进行选择,表示在全文搜索时,是否将此字段纳入全文搜索范围中
权重:此设置影响的只是全文搜索时,匹配的分数,权重越大,相对占比分数越大,在使用相对度进行降序排序时,位置也就越靠前。
筛选条件的用法,和普通mysql数据库搜索的区别在于,只用添加了索引才可被选中

前台对于全文搜索服务的调用,和使用普通mysql数据库搜索时一样,直接将获取到的结果放入对象数组中,就可以在前台通过循环创建进行展示

展示内容中如需高亮提示检索中命中关键词,只需在文本的高亮显示文本属性上,绑定获取到数据的命中词字段




文档反馈