该功能暂时仅针对系统整体部署企业用户开放
功能概述
ES数据库,即elastic search数据库,是一种专门用来做全文搜索的分布式数据库,也是当前市面上同类数据库中使用最广的一个数据库软件。其主要功能是将数据进行分词索引,并当用户输入一个查询语句时,对查询语句进行分词,在现有的数据分词库中进行匹配查询,并返回匹配程度最高的数据记录。因此,和普通的mysql数据库(在ivx中,底层可以对接mysql、mariaDB、postgresql、sqlserver等,我们在这里统称mysql数据库)不同,我们可以利用ES数据库来实现全文搜索,模糊查询等等功能,ES的分词索引与分布式计算结构,可以非常快速的对用户的查询进行返回,而不是像普通的mysql数据库那样需要用“包含”这种效率极低的数据遍历查询。
由于ES数据库在设计时的目的就是做全文搜索,因此其底层实现和mysql数据库有很大的不同,我们在这里简要列举一下,请大家根据具体的使用场景来决定使用哪一种数据库(或结合使用两种数据库):
反向索引的原理
ES数据库的核心原理就是反向索引(inverted index),其操作即把数据库里的某个字段里的文本信息,进行分词,然后该字段中的所有数据的分词,统一标记。比如,我们有一个字段叫“菜品名称”,里面有3条数据:
由于我们给这个“菜品名称”字段添加了分词索引,ES数据库会分别针对每一条数据,进行分词,分词的结果大概是这样:
分词索引,除了会记录每条数据的分词,还会记录这些词的位置,用来做之后一些高级的搜索,比如,我们可以指定搜索时,两个分词必须连在一起。
分词完毕后,这个数据库就可以处理用户的搜索请求了,比如,当用户要求查询 “牛肉披萨”时,系统会先将其分词为“牛肉”和“披萨”,然后在每条数据记录里查询,会得到这个结果:
在以上例子中,数据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个索引选项的意义:
添加数据
如上文所说,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数据库搜索时一样,直接将获取到的结果放入对象数组中,就可以在前台通过循环创建进行展示
展示内容中如需高亮提示检索中命中关键词,只需在文本的高亮显示文本属性上,绑定获取到数据的命中词字段