python+mysql+elasticsearch常见问题解决指南
1、python+Elasticsearch问题
1:安装:pip install elasticsearch
2:连接:
from elasticsearch import Elasticsearch
es = Elasticsearch(['http://localhost:9200']) # 单个
es = Elasticsearch("['http://xxx.xxx.x.x:9200','http://xxx.xxx.x.x:9200']") # 多个
记住是http而不是https,否则会连接失败!
3:查询:result = es.search(index="xxx", size=20)
# xxx为自己的索引(数据表),size为想要展示的结果数量,还有一些其他参数可以根据自己需求进行设置。
4:删除或更新索引(数据表)中的文档(数据):通常来讲是通过对id的处理来实现的,例如:es.delete(index='xxx',id=xxx) 或是 es.update(index="xxx", id=xxx, body={"doc": {xxx}})
,但通常来讲如果不在插入文档时指定id,则会由系统自动分配id,因而难以进行简单的精准定位,此时可以选择利用条件查询来进行删除和更新,即利用查询的结构化语句来进行操作,即:es.delete_by_query(index='xxx',body=xxx)
或者直接查询到要删除的文档的id进行删除,即:
id = es.search(index='xxx', body=xxx)['hits']['hits'][0]['_id']
es.delete(index='sc', id = id)
这里在进行每一步修改操作后如果想要立即查询到结果需要先进行一步时间等待:
import time
time.sleep(1)
2、python+mysql日志问题
1、获取binlog日志:
from pymysqlreplication import BinLogStreamReader
from pymysqlreplication.row_event import WriteRowsEvent, UpdateRowsEvent, DeleteRowsEvent
MYSQL_SETTINGS = {'host': xxxx', 'user': 'xxx', 'password': 'xxxxxxxxx'}
stream=BinLogStreamReader(connection_settings=MYSQL_SETTINGS,
resume_stream=True, #这个参数如不设置会默认每次都读取先前进行过的所有操作!!!
server_id=x, #自己指定id
blocking=True,
only_schemas="content_search", #找到这个数据库的名字
only_tables=['modifysql'], #找到这个数据表的名字
only_events=[WriteRowsEvent, UpdateRowsEvent, DeleteRowsEvent] #指定操作
)
2、获取操作类型和操作内容:
for binlogstream in stream:
action_type = str(binlogstream).split(".")[2].split(" ")[0] # 获取类型
action_context = binlogstream.rows[0] # 获取内容
这样一来后续的增删改操作即可通过action_type进行分类处理,相对更为直观。
3、python+mysql+elasticsearch同步问题
对于这个问题,网上的大部分解决策略都是通过kafka生产消费者模式来实现的。但通过上述两个操作后,我觉得这里可以直接根据mysql的日志操作类型和操作内容来连接到elasticsearch的索引更新操作来实现,实际运行上也能够正常实现。不知道这样做和通过kafka模式来实现有什么区别或者弊端,还得后续继续研究发现。如果有大佬了解也欢迎留言指正~