python操作Elasticsearch7.x


python3  elasticsearch 先看下面我給准備的干貨,如果不能滿足,pls 

官網文檔  :https://pypi.org/project/elasticsearch/ 

 dev 文檔: https://elasticsearch-py.readthedocs.io/en/v7.15.1/

  開發API官網 例子: https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/examples.html

update delete documnt  見文章最后

1依賴: python3.7 

pip3 install elasticsearch==7.9.1

1、連接ES,創建索引

from elasticsearch import Elasticsearch
 
es = Elasticsearch(
    ['127.0.0.1:9200'],
    # 在做任何操作之前,先進行嗅探
    # sniff_on_start=True,
    # # 節點沒有響應時,進行刷新,重新連接
    sniff_on_connection_fail=True,
    # # 每 60 秒刷新一次
    sniffer_timeout=60
)
 
index_name = 'my_index'
 
request_body = {
    'mappings': {
        'properties': {
            'name': {
                'type': 'text'
            },
            'id': {
                'type': 'integer'
            },  
        }
    }
}
 
# 創建索引
es.indices.create(index=index_name, body=request_body)

2、判斷索引是否存在

為防止在創建索引的時候出現重復,產生錯誤,在創建之前最好判斷一下索引是否存在

from elasticsearch import Elasticsearch
 
index_name = 'my_index'
es = Elasticsearch(
    ['127.0.0.1:9200'],
    # 在做任何操作之前,先進行嗅探
    # sniff_on_start=True,
    # # 節點沒有響應時,進行刷新,重新連接
    sniff_on_connection_fail=True,
    # # 每 60 秒刷新一次
    sniffer_timeout=60
)
 
# 索引存在,先刪除索引
if es.indices.exists(index_name):
    es.indices.delete(index=index_name)
else:
    print('索引不存在,可以創建')
# 創建索引
es.indices.create(index=index_name, body=request_body)
      
# 查看索引的信息
print(es.info())

也可以訪問 :localhost:9200/_cat/indices?v  查看所有的索引

3、刪除索引

刪除指定地址的ES服務的索引

from elasticsearch import Elasticsearch
 
index_name = 'my_index'
es = Elasticsearch(
    ['127.0.0.1:9200'],
    # 在做任何操作之前,先進行嗅探
    # sniff_on_start=True,
    # # 節點沒有響應時,進行刷新,重新連接
    sniff_on_connection_fail=True,
    # # 每 60 秒刷新一次
    sniffer_timeout=60
)
 
es.indices.delete(index=index_name)

4、索引增加數據

from elasticsearch import Elasticsearch
index_name = 'my_index'
 
es = Elasticsearch(
    ['127.0.0.1:9200'],
    # 在做任何操作之前,先進行嗅探
    # sniff_on_start=True,
    # # 節點沒有響應時,進行刷新,重新連接
    sniff_on_connection_fail=True,
    # # 每 60 秒刷新一次
    sniffer_timeout=60
)
 
request_body = {
    'mappings': {
        'properties': {
            'name': {
                'type': 'text'
            },
            'id': {
                'type': 'integer'
            },  
        }
    }
}
 
# 索引存在,先刪除索引
if es.indices.exists(index_name):
    es.indices.delete(index=index_name)
else:
    print('索引不存在,可以創建')
# 創建索引
es.indices.create(index=index_name, body=request_body)
 
es.index(index=index_name, id='1', body={
            'name': '法外狂徒-張三',
            'id': 1,
        }
        )
 
es.index(index=index_name, id='2', body={
            'name': '普法教育-李四',
            'id': 2,
        }
        )

5、獲取數據

from elasticsearch import Elasticsearch
index_name = 'my_index'
es = Elasticsearch(
    ['127.0.0.1:9200'],
    # 在做任何操作之前,先進行嗅探
    # sniff_on_start=True,
    # # 節點沒有響應時,進行刷新,重新連接
    sniff_on_connection_fail=True,
    # # 每 60 秒刷新一次
    sniffer_timeout=60
)
 
# 查詢數據包含兩種 get search
 
# get 查詢數據
res = es.get(index=index_name, id='1')    # 我用的是es7,doc_type 可以不傳,也可以查詢到
 
# search 查詢數據
# 查詢所有商品數據 match_all
body = {
    'query': {
        'match_all': {}
    },
    'from': page * page_size,       # 從第幾條數據開始
    'size': page_size   # 獲取多少條數據
}
requ_data = es.search(index=index_name, body=body)
 
 
# 精確查找 term  查詢name='法外狂徒-張三'的所有數據 
body = {
    'query': {
        'term': {
            'name': '法外狂徒-張三'
        }
    },
}
 
# 精確查找 terms 
body = {
    'query': {
        'terms': [
            '法外狂徒-張三', '普法教育-李四'
        ]
    },
}
 
# match: 匹配name包含 ‘法外狂徒-張三’的所有數據
body = {
    'query': {
        'match': [
            'name': '法外狂徒-張三'
        ]
    },
}
 
# 查詢id和name包含  法外狂徒-張三
 
body = {
    'query': {
        'multi_match': [
            'query': '法外狂徒-張三',
            'fields': ['name', 'id']
        ]
    },
}
 
# 搜索出id為1或者2的所有數據
 
body = {
    'query': {
        'ids': [
            'type': 'test_type',
            'values': ['1', '2']
        ]
    },
}

6、復合查詢bool

# 符合查詢bool
# bool有3類查詢關系,must(都滿足),should(其中一個滿足),must_not(都不滿足)
from elasticsearch import Elasticsearch
 
 
index_name = 'my_index'
es = Elasticsearch(
    ['127.0.0.1:9200'],
    # 在做任何操作之前,先進行嗅探
    # sniff_on_start=True,
    # # 節點沒有響應時,進行刷新,重新連接
    sniff_on_connection_fail=True,
    # # 每 60 秒刷新一次
    sniffer_timeout=60
)
 
 
body = {
    'query': {
        'bool': {
            'must': [
                {
                    'term': {
                        'name': '法外狂徒-張三'
                    }
                },
                {
                    'term': {
                        'id': 1
                    }
                }
            ]    
        }    
    }
}
 
# 查詢name=‘法外狂徒-張三’並且id=1的數據
es.search(index=index_name, body=body)

7、切片式查詢

# 切片式查詢
from elasticsearch import Elasticsearch
 
 
index_name = 'my_index'
es = Elasticsearch(
    ['127.0.0.1:9200'],
    # 在做任何操作之前,先進行嗅探
    # sniff_on_start=True,
    # # 節點沒有響應時,進行刷新,重新連接
    sniff_on_connection_fail=True,
    # # 每 60 秒刷新一次
    sniffer_timeout=60
)
 
 
body = {
    'query': {
        'match_all': {}    
    },
    'from': 2,        # 從第二條數據開始
    'size': 4         # 獲取4條數據
}
 
# 從第2條數據開始,獲取4條數據
es.search(index=index_name, body=body)

8、范圍查詢

# 范圍查詢
from elasticsearch import Elasticsearch
 
 
index_name = 'my_index'
es = Elasticsearch(
    ['127.0.0.1:9200'],
    # 在做任何操作之前,先進行嗅探
    # sniff_on_start=True,
    # # 節點沒有響應時,進行刷新,重新連接
    sniff_on_connection_fail=True,
    # # 每 60 秒刷新一次
    sniffer_timeout=60
)
 
 
body = {
    'query': {
        'range': {
            'id': {
                'gte': 1,        # >=1   
                'lte': 5,        # <=5
            }
        }    
    },
}
 
# 查詢1<=id<=5的所有數據  
# gte 和 lte 也可以換成換成 from 和 to
es.search(index=index_name, body=body)

9、前綴查詢

# 前綴查詢
from elasticsearch import Elasticsearch
 
 
index_name = 'my_index'
es = Elasticsearch(
    ['127.0.0.1:9200'],
    # 在做任何操作之前,先進行嗅探
    # sniff_on_start=True,
    # # 節點沒有響應時,進行刷新,重新連接
    sniff_on_connection_fail=True,
    # # 每 60 秒刷新一次
    sniffer_timeout=60
)
 
 
body = {
    'query': {
        'prefix': {
            'name': ''
        }    
    },
}
 
# 查詢前綴為 ‘法’的所有數據
es.search(index=index_name, body=body)

10、通配符查詢

# 通配符查詢
from elasticsearch import Elasticsearch
 
 
index_name = 'my_index'
es = Elasticsearch(
    ['127.0.0.1:9200'],
    # 在做任何操作之前,先進行嗅探
    # sniff_on_start=True,
    # # 節點沒有響應時,進行刷新,重新連接
    sniff_on_connection_fail=True,
    # # 每 60 秒刷新一次
    sniffer_timeout=60
)
 
 
body = {
    'query': {
        'wildcard': {
            'name': '*三'
        }    
    },
}
 
# 查詢所有以 ‘三’結尾的數據
es.search(index=index_name, body=body)

11、查詢的數據排序

# 排序查詢
from elasticsearch import Elasticsearch
 
 
index_name = 'my_index'
es = Elasticsearch(
    ['127.0.0.1:9200'],
    # 在做任何操作之前,先進行嗅探
    # sniff_on_start=True,
    # # 節點沒有響應時,進行刷新,重新連接
    sniff_on_connection_fail=True,
    # # 每 60 秒刷新一次
    sniffer_timeout=60
)
 
 
body = {
    'query': {
        'match_all': {} 
    },
    'sort': {
        'id': {                    # 根據id字段升序排序
            'order': 'asc'         # asc 升序, desc 降序
        }
    }
}
 
# 查處所有數據並按照id大小排序
es.search(index=index_name, body=body)

 

11. update  documnt:  update:https://www.elastic.co/guide/en/elasticsearch/reference/7.15/search-search.html

To update a document, you need to specify three pieces of information: indexid, and a body:

from datetime import datetime from elasticsearch import Elasticsearch es = Elasticsearch() doc = { 'author': 'author_name', 'text': 'Interesting modified content...', 'timestamp': datetime.now(), } res = es.update(index="test-index", id=1, body=doc) print(res['result'])

 

12 Deleting a document

You can delete a document by specifying its index, and id in the delete() method:

es.delete(index="test-index", id=1)

 

原文:https://blog.csdn.net/weixin_41979456/article/details/111932972


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM