程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

elasticsearch~Python與ElasticSearch交互

編輯:Python

一、基礎操作

一、安裝庫

  • 包名: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'}}))

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved