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 = id
        self.area = area
        self.cmp = cmp
        self.edu = edu
        self.exp = exp
        self.title = title
        self.job_type = job_type
        self.pv = pv
        self.jd = jd
        self.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

你可能感兴趣的:(大数据,python,elasticsearch,开发语言)