ES字段类型和写入逻辑

1、数字类型

long,integer,short,byte,double,float, half_float, scaled_float 在满足需求的情况下,尽可能选择范围小的数据类型

2、字符串:string

keyword:适用于索引结构化的字段,可以用于过滤、排序、聚合,只能通过精确值(exact value)搜索到,id应该用keyword。

text:当一个字段是要被全文搜索的,比如Email内容、产品描述,这些字段应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合。

为啥不会为text创建索引

字段数据会占用大量堆空间,尤其是在加载高基数text字段时,字段数据一旦加载到堆中,就在该段的生命周期内保持在那里。加载字段数据是昂贵的,可能导致用户遇到延迟问题。这就是默认情况下禁用text的原因。

在同一字段中同时具有全文本(text)和关键字(keyword)版本会很有用:一个用于全文本搜索,另一个用于聚合和排序

3、date(时间类型):exact value,精确匹配

4、布尔类型:boolean

5、binary(二进制):binary

6、range(区间类型)

integer_range、float_range、long_range、double_range、date_range

写入(持久化)逻辑

数据持久化步骤如下:write -> refresh -> flush -> merge

一个新文档(doc、commit point)过来,会存储在 in-memory buffer 内存缓存区中,顺便会记录 Translog。

这时候数据还没到 segment ,是搜不到这个新文档的。数据只有被 refresh 后,才可以被搜索到,可以通过ID使用GET来获得该文档

refresh过程

refresh 默认 1 秒钟执行一次。ES 支持修改,通过 index.refresh_interval 设置 refresh(冲刷)间隔时间。

refresh后,in-memory buffer 中的文档写入到新的 segment 中,但 segment 是存储在文件系统的缓存中,此时文档可以被搜索到

然后清空 in-memory buffer,translog 没有被清空,是为了将 segment 数据写到磁盘。

文档经过 refresh 后,segment 暂时写到文件系统缓存,这样避免了性能 IO 操作,又可以使文档搜索到。

refresh 默认 1 秒执行一次,性能损耗太大。一般建议稍微延长这个 refresh 时间间隔,比如 5 s。因此,ES 其实就是准实时,达不到真正的实时。

translog

每个 Shard 中都存在一个 translog,这意味着它与物理磁盘内存有关。

它是同步且安全的,因此即使对于尚未提交的文档,您也可以获得持久性。如果发生问题,可以还原事务日志。

在每个设置的时间间隔内,或在成功完成请求(索引,批量,删除或更新)后,将事务日志提交到磁盘。

flush

内存缓冲区的 segments 写入写合并的 Segment 后落盘,清空 translog。对应 Lucene Commit 操作。

merge

每一个segment都会占用文件句柄,内存资源,cpu资源,每一个搜索请求都必须访问每一个segment,这就意味着存在的segment越多,搜索请求就会变得更慢。

最大 segment 大小是 5GB。那么一个比较庞大的数据索引,就必然会有为数不少的 segment 永远存在。

merge:就是各个小段文件,合并成一个大段文件。段合并过程段合并结束,旧的小段文件会被删除。

由于归并任务太消耗资源,所以一般不太选择加大 index.merge.policy.max_merged_segment 配置,而是在负载较低的时间段,通过 force merge 接口,强制归并 segment。

修改和删除

Lucene为了提高搜索的实时性,采用不可再修改(immutable)方式将文档存储在一个个segment中。一个segment在写入到存储系统之后,将不可以再修改。

更新不会修改原来的 segment,更新和创建操作都会生成新的一个 segment。

当用户发出命令删除一个被索引的文档#A,该文档并不会被马上从相应的存储它的segment中删除掉,而是通过一个特殊的文件来标记该文档已被删除,即:标记 .del 文件维护删除

当用户再次搜索到时,Elasticsearch在segment中仍能找到#A,但由于#A文档已经被标记为删除,所以Lucene会从发回给用户的搜索结果中剔除#A,所以给用户感觉的是#ABC已经被删除了。

唠嗑广场

在金融的二级市场里面,股票、基金、可转债、债券、期权,各类投资品种都很多。

如果都了解了,那就真的挺专业的了,但这些都需要了解吗?如果需要,那就变成了金融投资者,而不是企业研究者。

作为一个业余的、把投资当做第二职业的人来说,时间是宝贵的,能够摸清楚一个市场的一个品种,比如最常见的A股的股票,摸清摸透,就很不错了。