elasticsearch 查询_ElasticSearch查询操作python版

249c8a375de57ec01b39782256322fc8.png

安装库

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
  1. 名字含有张三并且年龄大于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值