Python模組的使用-- elasticsearch模組
阿新 • • 發佈:2019-01-09
Python操作Elasticsearch
參考整理了一下,當做學習筆記,記錄一下。
安裝模組
pip install elasticsearch # 6.x版本
Python操作Elasticsearch
建立索引
from elasticsearch import Elasticsearch
es = Elasticsearch()
result = es.indices.create(index='news', ignore=400)
print(result) # {'acknowledged': True, 'index': 'news', 'shards_acknowledged': True} acknowledged 為True表示建立成功
刪除索引
result = es.indices.delete("news", ignore=[400, 404])
print(result) # {'acknowledged': True}
插入一條document
# 法一
es.create("news", "politics", body=content, id=1)
# 法二
es.index("news", doc_type="politics", body=data) # ok 可以不用指定id, 引數id預設為隨機建立
更新資料
# 法一
data = {'date': '2018-01-05 12:30:00' ,
'title': 'asd123',
'url': 'http://view.news.qq.com/zt2011/usa_iraq/index.htm'}
result = es.update(index='news', doc_type='politics', body=data, id=1) # error
print(result)
data_doc = {'doc': {'date': '2018-01-05 12:30:00',
'title': 'asd123',
'url': 'http://view.news.qq.com/zt2011/usa_iraq/index.htm'}}
result = es.update(index='news', doc_type='politics', body=data, id=1) # ok
print(result)
# 法二
data = {'date': '2018-01-05 12:30:00',
'title': 'asd123',
'url': 'http://view.news.qq.com/zt2011/usa_iraq/index.htm'} # ok 使用data_doc也ok
es.index(index='news', doc_type='politics', body=data, id=1)
刪除資料
result = es.delete("news", "politics", id='vNaqc2cBE_LRbsBxQ94C') # ok
查詢資料
# 指定分詞器 安裝一個分詞外掛,這裡使用的是 elasticsearch-analysis-ik
# mapping 資訊中指定了分詞的欄位,指定了欄位的型別 type 為 text,分詞器 analyzer 和 搜尋分詞器 search_analyzer 為 ik_max_word
mapping = {
'properties': {
'title': {
'type': 'text',
'analyzer': 'ik_max_word',
'search_analyzer': 'ik_max_word'
}
}
}
query = {
'query': {
'match': {
'title': '中國 領事館'
}
}
}
es = Elasticsearch()
result = es.search(index='news', doc_type='politics', body=query)
print(result)
查詢並刪除
# 匹配大於21歲的文件
query = {"query": {"range": {"age": {"gt": 21}}}}
es.delete_by_query(index='indexName', body=query, doc_type='typeName')
查詢相關
datas = [{'age': 34,'date': '2018-01-01','sex': '男', 'title': '鏢旗標題啊111,Python ElasticSearch基礎教程'}, {'age': 10, 'date': '2017-05-13', 'sex': '男', 'title': '標題2'},{'age': 24, 'date': '2019-01-01', 'sex': '女', 'title': 'haha'}]
# 查詢所有
query = {"query": {"match_all":{}}}
# 提供boost引數可以修改_score
query = {"query": {"match_all": {"boost": 1.2}}}
# 查詢所有相反操作, 不匹配任何文件
query = {'query': {'match_none': {}}}
## 全文查詢相關
#(1)匹配查詢
query = {"query": {"match" : {"title" : "Python"}}}
# (2) 多匹配查詢
query = {'query': {'multi_match': {'fields': ['title', 'sex'], 'query': '標題 男'}}}
# (3) term
body = {"query":{"term":{"title":"python"}}} # 查詢title包含"python"的所有資料
es.search(index="bbs",doc_type="user",body=body)
# (4) terms
body = {"query":{"terms":{"title":["python","標題"]}}}
es.search(index="bbs",doc_type="user",body=body) # 搜尋出title包含"python"或包含"標題"的所有資料
# (5) ids
body = {"query":{"ids":{"type":"user","values":["1", "z9Yrd2cBE_LRbsBxdt7t"]}}}
# 搜尋出id為1或對應id的資料
es.search(index="bbs",doc_type="user",body=body)
# (6) 複合查詢bool
# bool有3類查詢關係,must(都滿足),should(其中一個滿足),must_not(都不滿足)
body = {'query': {'bool': {'should': [{'term': {'title': 'python'}},{'term': {'age': 24}}]}}}
es.search("bbs", doc_type="user", body=body)
# (7) 切片查詢
body = {'from': 2, 'query': {'match_all': {}}, 'size': 4} # from 從第二條開始查詢 size查詢4條記錄
# (8) 範圍查詢
body = {'query': {'range': {'age': {'gte': 10, 'lte': 32}}}} # 大於等於10,小於等於32
es.search("bbs", doc_type="user", body=body)
# (9) 字首查詢
body = {'query': {'prefix': {'title': '標'}}}
# (10) 萬用字元查詢
body = {'query': {'wildcard': {'title': 'python*'}}}
# (11) 排序
body = {'query': {'match_all': {}}, 'sort': {'age': {'order': 'desc'}}} # 升序asc 降序desc
# (12) 相應過濾
es.search("bbs", "user", filter_path=["hits.hits._id", "hits.hits._source.title"]) # 獲取id和對應的title
es.search("bbs", "user", filter_path=["hits.hits.*"]) # 獲取所有資料
# (13) 執行查詢並獲取查詢匹配數
es.count(index="bbs", doc_type="user") # {'_shards': {'failed': 0, 'skipped': 0, 'successful': 5, 'total': 5}, 'count': 3}
參考文件:
https://elasticsearch-py.readthedocs.io/en/master/api.html#global-options
https://blog.csdn.net/u013429010/article/details/81746179