ES(version7.x) 操作记录–python
1.创建
第一种方式为直接创建
# settings 为数据库的配置
settings = {
"mappings": {
"properties": { #字段配置
"x_id": {"type": "integer"}, #type为指定类型
"x_word": {"type": "text"},
}
}
}
es.indices.create(index="你的db名称", body=settings)
第二种方式为用index直接insert数据,若无对应index(也就是db)会自动去创建
index = "test_index"
type = "test_type"
es.index(index=index, doc_type=type,body={"test_insert":"1111"})
批量新增(bulk)
data = [{"_index": "test_index", "_type": "test_type", "_source": {"name": random.choice(word_list), "id": i}} for i in range(1000000)]
helpers.bulk(es, data)
2.查询
查询的东西比较多,具体可以参考:Python Elasticsearch api
说一下遇到的问题:
type为text的时候是存在分词器的,这个时候数据是以列表的方式存在
如:"小王"是以[“小”,“王”]这种方式存在,所以有时候用term无法匹配到
参考文档:es match、match_phrase、query_string和term的区别
深度分页的问题
先说一句别的
ES对查询结果的展示默认只显示10条,要想展示更多的话,需要在请求体中加上size参数。
{
"query": {
"match_all": {}
},
"size": 1000
}
一般在实际生产环境中数据量都是比较大的,es中默认最大长度为10000条,可以通过index.max_result_window来设置最大返回条数
一般使用from+size这个是比较简单的,如果数据量不多的使用这个应该是没有太大问题,如果数据量大的的话就会出现问题,每次都要先执行一次from+size操作,所以当页数多了之后会出现比较卡或者崩掉的操作。
search_after
这个是深度分页的一种,跟据上一页的位置来确定下一页的数据,而且可以实现实时查询,不过需要使用一个全局唯一的字段来进行查询,这个全局唯一字段可以自行定义,下图中使用的自行定义的id字段来做的
感觉有点像sql中的
SELECT * FROM `table` WHERE id >起点值 LIMIT 2;
第一次执行
{
"query": {"match": {"name": "王"}},
"sort": {"id": "desc"}
}
然后每次执行
{
"query": {"match": {"name": "王"}},
"sort": {"id": "desc"},
"search_after": [这里放上自己作为起点的唯一值]
}
ps:sort是要加上的,不然会报错
3.删除
按条件来删除,更改条件即可
body = {"query": {"match_all": {}}}
es.delete_by_query(index="test_index", doc_type="test_type", body=body)
4.更新
pass
等候有时间更新