elasticsearch~Python与ElasticSearch交互

一、基础操作

一、安装库

  • 包名:elasticsearch

  • 下载命令

    • 普通版本:python -m pip install elasticsearch
    • 异步版本:python -m pip install elasticsearch[async]

二、创建es对象

  • Elasticsearch():实例化es对象

    • host:IP地址
    • port:端口号
    • timeout:超时时间
    from elasticsearch import Elasticsearch
    
    # 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
    es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)
    

二、创建索引

  • es.indices.create():创建索引

    • index:要新创建的索引
    from elasticsearch import Elasticsearch
    
    # 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
    es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)
    # 创建一个索引为test的索引
    es.indices.create(index='test')
    

三、删除索引

  • es.indices.delete():删除索引

    • index:要删除的索引
    from elasticsearch import Elasticsearch
    
    # 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
    es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)
    # 删除索引为test的索引
    es.indices.delete(index='test')
    

四、插入数据

  • es.index():插入数据

    • index:要插入数据的索引
    • id:要插入数据的ID值
    • body:要插入的数据(不提倡)
    • document:要插入的数据(提倡)
    from elasticsearch import Elasticsearch
    
    # 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
    es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)
    # 在test索引id为1的位置插入一条数据
    es.index(index='test',
             id=1,
             body={"id":'1',"name":"小明"})
    
    from elasticsearch import Elasticsearch
    
    # 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
    es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)
    doc = {
        'name': '方天',
        'age': '23'
    }
    # 在test索引id为2的位置插入一条数据
    es.index(index='test', id='2', document=doc)
    
  • es.create():插入数据,可以不指定id,create会自动添加id

    • index:要插入数据的索引
    • id:要插入数据的ID值
    • body:要插入的数据(不提倡)
    • document:要插入的数据(提倡)
    from elasticsearch import Elasticsearch
    
    # 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
    es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)
    doc = {
        'name': '杨晨',
        'age': '22'
    }
    # 在test索引id为3的位置插入一条数据
    es.create(index='test',id='3', document=doc)
    

五、删除数据

  • es.delete():删除指定数据

    • index:要删除数据的索引
    • id:要删除数据的id
    from elasticsearch import Elasticsearch
    
    # 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
    es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)
    # 删除test索引id为3的数据
    es.delete(index='test',id='3',doc_type='_doc')
    

六、更新数据

  • es.update():更新指定字段

    • index:要更新的索引
    • id:要更新的id
    • doc:要更新的数据
    from elasticsearch import Elasticsearch
    
    # 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
    es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)
    doc = {
        'name': '李邱俊',
        'age': '20'
    }
    # 将test索引id为2的数据更新为新数据
    es.update(index='test',id='2',doc=doc)
    

六、查询操作

  • es.get():查询数据

    • index:要查询数据的索引
    • id:要查询数据的id
    from elasticsearch import Elasticsearch
    
    # 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
    es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)
    # 查询test索引id为1的数据
    es.get(index='test',id='1')
    
from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)
# 查询test索引前10条的数据
es.search(index='test')
# 查询test索引的全部数据
es.search(index='test', query={'match_all': {}})
# 查询test索引中name字段为‘杨晨’的数据
es.search(index='test', query={'match':{'name':'杨晨'}})
# 显示test索引中,从位置1开始查询的两条数据
es.search(index='test',size=2,from_=1)
# 显示test索引中的所有age字段数据
es.search(index='test',filter_path=['hits.hits._source.age'])

七、刷新索引

  • es.indices.refresh():刷新索引

    • index:要刷新的索引
    from elasticsearch import Elasticsearch
    
    # 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
    es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)
    # 刷新test索引的数据
    es.indices.refresh(index='test')
    

二、高级功能(查询操作)

  • es.search():按照指定规则查询

    • index:要查询数据的索引

    • size:查询所少条数据

    • from_:从指定索引开始查询

    • filter_path:添加过滤路径,显示指定字段(默认显示所有字段信息)

    • query:要查询数据的规则

      • query={‘match_all’:{}}:查询所有语句
      • query={‘match’:{‘name’:‘杨晨’}}:检索指定字段
      • match:模糊查询(分词)
      • match_phrase:模糊查询(不分词)
      • term:精确单值查询
      • terms:精确多值查询
      • multi_match:多字段查询
        • query:要查询的内容
        • fields:要查询的字段
      • prefix:前缀查询
      • wildcard:通配符查询
        • ?:代表一个字符
        • *:代表0或多个字符
        • 只能查询单一格式的数据,都是英文或都是汉字,两者混合不能使用
      • regexp:正则查询
      • bool:多条件查询
        • must:与(and)
        • should:或(or)
        • must_not:非(no)
      • exists:存在字段查询
      • range:范围查询
        • gt:大于
        • gte:大于等于
        • lt:小于
        • lte:小于等于
      • nested:json数据查询
        • path:指定json数据的字段
        • query:指定查询方式
    • sort:排序查询

      • asc:升序
      • desc:降序

一、基础查询

from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)

# 查询test索引前10条数据
print(es.search(index='test'))

二、过滤字段查询

from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)

# 只显示test索引的age字段信息
print(es.search(index='test',filter_path=['hits.hits._source.age']))

三、切片查询

from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)

# 查询test索引中,从序号为1的位置查询两条数据
print(es.search(index='test', from_=1, size=2))

四、模糊查询(分词)

from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)

# 查询test索引中,age字段为20的数据
print(es.search(index='test', query={'match':{'age':20}}))

五、模糊查询(不分词)

from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)

# 查询test索引中,name字段为杨晨的数据
print(es.search(index='test', query={'match_phrase':{'name':'杨晨'}}))

六、精准单值查询

from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)

# 查询test索引中,age为20的数据
print(es.search(index='test', query={'term':{'age':20}}))
# 查询test索引中,name为杨晨的数据,查询中文,要在字段后面加上.keyword
print(es.search(index='test', query={'term':{'name.keyword':'杨晨'}}))

七、精准多值查询

from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)

# 查询test索引中,name为杨晨或小明的数据
print(es.search(index='test', query={'terms':{'name.keyword':['杨晨','小明']}}))

八、多字段查询

from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)

# 查询test索引中,name和about都为小美的数据
print(es.search(index='test',query={'multi_match':{'query':'小美',"fields":['name','about']}}))

九、前缀查询

from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)

# 查询test索引中,name字段前缀为小的数据
print(es.search(index='test',query={'prefix':{'name.keyword':'小'}}))

十、通配符查询

from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)

# 查询test索引中,name字段为杨*的数据
print(es.search(index='test',query={'wildcard':{'name.keyword':'杨?'}}))

十一、正则查询

from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)

# 查询test索引中,name字段为杨*的数据
print(es.search(index='test',query={'regexp':{'name.keyword':'杨.'}}))

十二、多条件查询

from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)

# 查询test索引中,name字段为小美,id字段为1的数据
print(es.search(index='test',query={'bool':{'must':{'term':{'name':'小美'},'term':{'id':'1'}}}}))

十三、存在字段查询

from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)

# 查询test索引中,包含age字段的数据
print(es.search(index='test',query={'exists':{'field':'age'}}))

十四、范围查询

from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)

# 查询test索引中,age字段大于20小于等于23的数据
print(es.search(index='test',query={'range':{'age':{'gt':20,'lte':23}}}))

十五、Json字段查询

from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)

# 查询test索引中,jsonfield1字段下json数据jsonfield2字段的数据包含'json'的数据
print(es.search(index='test',query={'nested':{'path':'jsonfield1','query':{'term':{'jsonfield1.jsonfield2':'json'}}}}))

十六、排序

from elasticsearch import Elasticsearch

# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost",port=9200,timeout=3600)

# 查询test索引中的数据,按照age字段降序
print(es.search(index='test', sort={'age.keyword':{'order':'desc'}}))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值