ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Python代码操作ES

Python代码操作ES

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
返回列表