1,ElasticSearch准实时索引实现
Es在保存数据的时候时分区/分片存储的,每一个分区/分片都对应着一个Lucene实例
- 每一个分区/分片对应多个文件,一个文件就是一个Segment(段)
- Segment
- 就是可以被检索的最小单元,每一个Segment都对应着一个倒排索引
Refresh到内存Segment:
- 从内存中的缓冲区 (buffer) 到内存中的segment (建立了内存中的倒排索引)
- refresh默认1秒一次,也可以根据JVM堆内存进行refresh,10%的堆内存进行refresh。
Flush到磁盘:
- 当保存在内存中的segment触发了阈值, 就会把内存中的segment写入到磁盘
- ES默认每隔30分钟/512m把内存中的segment数据写入到磁盘中
Translog 溢写日志:
- 在数据写入内存的同时, 还会写一份相同的数据到磁盘, 这份数据会写入到Translog中, 如果在refresh期间出现了异常导致程序挂掉, 当程序再次启动的时候, 可以从translog中恢复回来
- 当走了Flush刷新之后, 说明translog中对应的数据,已经建好了倒排索引, 并且保存到了磁盘上的segment , 数据丢失的概率很小了, translog会被清空
在大批量数据写入ES的时候,应该先关闭自动refresh,数据写入之后再打开自动refresh
ES准实时索引完整流程
buffer(缓冲区)->segment(数据段)->refresh(刷新 内存buffer->内存sgment)->flush(刷新 内存segment->磁盘segment ->translog(溢写日志))
2,Python代码操作ES
创建一个实体类,用来表示一条招聘信息
class JobDetail():def __init__(self, id, area, cmp, edu, exp, title, job_type, pv, jd, salary):self.id = idself.area = areaself.cmp = cmpself.edu = eduself.exp = expself.title = titleself.job_type = job_typeself.pv = pvself.jd = jdself.salary = salary# 返回为字典数据, 用于后续方便使用, 此处也可以尝试使用JSON方式转换def get_document(self):return {'id': self.id, 'area': self.area, 'cmp': self.cmp, 'edu': self.edu, 'exp': self.exp,'title': self