安装库
pip install elasticsearch
引入库
from elasticsearch import ElasticSearches = ElasticSearch(['localhost:9200'])
创建索引
es.indices.create(index='project', ignore=400)
删除索引
es.indices.delete(index='project', ignore_unavailable=True)
ignore_unavailable: 忽略无效的索引
插入数据
for i in range(10): body = { 'name': '张三' % i, 'age': 20 + i, 'desc': '我是张家的老' % i } es.create(index='project', doc_type='_doc', body=body, id=i) # es.index(index='project', doc_type='_doc', body=body)
PS: es.create必须制定id,es.index可以不指定id
删除数据
# 按照制定ID删除es.delete(index='project', doct_type='_doc', id=1)# 按照查询条件删除body = { 'query': { 'match': { 'name': '张三' } }}es.delete_by_query(index='project', body=body)
更新数据
# 按照制定ID更新es.update(index='project', doc_type='_doc', id=1, body={'doc': {'name': '李四'}}
查询数据
查询全部使用es.search(index=xxx, doc_type=xxx, body=xxx)的查询接口, 一下只写body查询语句
match 模糊查询
查询“我是张家的老3”
body = { 'query': { 'match': { 'desc': '我是张家的老3' } }}
结果会把每条数据都查询出来,因为默认会进行分词处理,“我 是 张家 的 老 3”, 然后只要查出来任意一个词匹配,都显示出来
match_phrase 精确查询
body = { 'query': { 'match_phrase': { 'desc': '我是张家的老3' } }}
只会查出来desc字段值为: 我是张家的老3, 这一条记录
multi_match 多字段匹配
multi_match涉及到匹配度评分的问题
body = { 'query': { 'multi_match': { 'query': '我的宝马多少马力', 'fields': ['name', 'desc'] } }}
在name和desc字段匹配含有“我的 宝马 多少 马力”的记录,如果要在所有字段中匹配:'fields': ['_all']
best_fields
希望匹配的文档占的评分比较高
body = { 'query': { 'multi_match': { 'query': '我的宝马发动机是多少', 'type': 'best_fields', 'fields': ['name', 'desc'], 'tie_breaker': 0.3 } }}
意思就是完全匹配“宝马 发动机”的文档评分会比较靠前,如果只匹配宝马的文档给他的评分乘以0.3的系数
most_fields
希望匹配字段越多的文档评分越高
body = { 'query': { 'multi_match': { 'query': '我的宝马发动机是多少', 'type': 'most_fields', 'fields': ['name', 'desc'] } }}
cross_fields
希望这个字段的分词词汇是分配到不同字段的
body = { 'query': { 'multi_match': { 'query': '我的宝马发动机是多少', 'type': 'crose_fields', 'fields': ['name', 'desc'] } }}
意思就是"宝马 发动机“必须在不同的字段中匹配到,如果在同一个字段中同时存在这两个,就不匹配
term 另一种模糊查询
term是完全匹配,不是精确匹配,有的文档把它归类到精确匹配是不对的
body = { 'query': { 'term': { 'desc': '老张家的' } }}
es默认存储是支持分词的,就是创建索引的时候可以指定mapping,按照分词来匹配,这句就可能是”老张 张家“,包含这两个的都会被匹配出来。但是使用了term查询,就是忽略分词,必须完整包含”老张家的“,才能被匹配出来
bool 联合查询
- must: 文档中必须包含
- must_not: 文档中必须不包含的not
- should: 文档中至少包含一条匹配 or
- 名字含有张三并且年龄大于25岁的
body = { 'query': { 'bool': { 'must': [ {'match': {'name': '张三'}}, {'match': {'age': {'gt': 25}}} ] } }}
2.名字包含张三且年龄不能大于25
body = { 'query': { 'bool': { 'must': [ {'match': {'name': '张三'}} ], 'must_not': [ {'match': {'age': {'gt': 25}}} ] } }}
3.名字包含张三或者年龄大于25
body = { 'query': { 'bool': { 'should': [ {'match': {'name': '张三'}}, {'match': {'age': {'gt': 25}}} ] } }}
PS:
1、不是只能使用match,其他的模糊查询和精确查询都可以使用
2、所有的查询操作在query上面加上'size': 2,表示只显示两个查询结果,要注意默认size=10