Es python常用查詢語句示例

2022-09-22 05:36:13 字數 4468 閱讀 9233

目錄

from elasticsearch import elasticsearch

# 建立連線

es = elasticsearch(

hosts=, # 位址

timeout=3600 # 超時時間

)#預設查詢,沒有任何篩選條件,預設顯示前10條資料的所有資訊

es.search(index='test') # index:選擇資料庫

通過指定字段,只顯示資料的指定字段資訊(預設顯示所有欄位的資訊)

#定義過濾字段,最終只顯示此此段資訊

filter_path=['hits.hits._source.ziduan1', # 欄位1

'hits.hits._source.ziduan2'] # 欄位2

es.search(index='test', filter_path=filter_path) # 指定字段:filter_path

通過制定body,進行條件查詢. 類似於mysql中的where.

# body指定查詢條件

body =

# 定義過濾字段,最終只顯示此此段資訊

filter_path=['hits.hits._source.ziduan1', # 欄位1

'hits.hits._source.ziduan2'] # 欄位2

es.search(index='test', filter_path=filter_path, body=body) # 指定查詢條件

body = 

},'size': 20 # 不指定預設是10,最大值不超過10000(可以修改,但是同時會增加資料庫壓力)

}# size的另一種指定方法

es.search(index='test', filter_path=filter_path, body=body, size=200) # 指定size,預設是10

body = 

}}

注:內容中的下劃線等標點符號會被忽略,有與沒有的效果一樣

只能查詢乙個字段,且只能指定乙個值. 類似於mysql中的 where ziduan='test'

body =

}}

只能查詢乙個字段,但可以同時指定多個值。類似於mysql中的where ziduan in a,b,c...

body =

}}

# 查詢多個欄位中都包含指定內容的資料

body =

}}

body = 

}}# 注:英文不需要加keyword

只能查詢單一格式的(都是英文本串,或者都是漢語字串)。兩者混合不能查詢出來。

body = 

}}

body = 

}}

# must: 各條件之間是and的關係

body = },}]}

}}

# should: 各條件之間是or的關係

body = },}]}

}}

# must_not:各條件都不滿足

body = },}]}

}}

# bool巢狀bool

# ziduan1、ziduan2條件必須滿足的前提下,ziduan3、ziduan4滿足乙個即可

body = }, # 多個條件並列 ,注意:must後面是[{}, {}],裡面的每個條件外面有個{}

},},}]

}}]}}

}

body =   # 查詢存在ziduan1的資料

}}# exists、bool巢狀查詢

# 存在ziduan1的情況下,ziduan2的值必須為指定字段

body = },},]

}}

}

body = }}

}

body =   # 根據ziduan1裡面的ziduan2資料查詢}}

}}# nest、bool巢狀查詢

body = },

# 根據ziduan1裡面的ziduan2資料查詢}}}

]}

}}

body = 

},"sort":

}}# 多欄位排序,注意順序!寫在前面的優先排序

body =

},"sort":[},

}],}

資料量小可以使用此方法,資料量大推薦使用search_after方法

body=},

'sort': , # 翻頁需要先使用sort排序,與search_after類似

}# size:設定一頁資料量

result = es.search(index='pv91', scroll='1m', size=5, body=body)

# 獲取總的資料量,用於得到總的資料頁數

total = result['hits']['total']

# 獲取初始翻頁id

scrid = result['_scroll_id']

# 第一頁的資料

result = es.search(index='test',size=5, body=body, filter_path=['hits.hits._source.ziduan1', 'hits.hits._source.ziduan2.ziduan2_1'])

# 開始翻頁

for i in range(5): #翻5頁

print(result, '\n')

print('*' * 50, '第{}頁'.format(i), '*' * 50)

result = es.scroll(scroll_id=scrid, scroll='1m', filter_path=['hits.hits._source.ziduan1', 'hits.hits._source.ziduan2.ziduan2_1'])

推薦此方法

content_size = 3000  # 設定一頁的資料量

size_cont = content_size

next_id = 0 # 初始化next_id,每次迴圈是從 此資料 之後的第1個資料開始

while size_cont == content_size:

body = }},

'sort': , # 以ziduan2為next_id,需要先對其進行排序

'search_after': [next_id], # 從此資料之後的第1個資料開始,但不包含此資料

'size': content_size # 指定當前頁資料量

}filter_path = [

'hits.hits._source.ziduan1',

'hits.hits._source.ziduan2'

]rt = es.search(index='pv1', body=body, filter_path=filter_path)['hits']['hits']

size_cont = len(rt) # 更新迴圈條件:若資料量不等於指定的資料量,說明遍歷到最後的一頁資料了

for result in rt:

try:

except:

continue

try:

ziduan2 = result['_source']['ziduan2']

next_id = ziduan2 # 更新next_id

except:

# 統計符合條件的指定欄位的資料中,各資料的個數

body =

# },

'size': 0, # 設定0為條件查詢後的資料顯示條數,預設顯示10條

'aggs':}},

}# 巢狀聚合:根據聚合後的資料大小再進行聚合

body = , # 選擇ziduan1裡面的資料量再進行聚合

"aggs": }},

},},

}# 去重統計

body = ,},}

}# 結果返回值說明

"""doc_count_error_upper_bound: 表示沒有在這次聚合中返回、但是可能存在的潛在聚合結果

sum_other_doc_count:表示這次聚合中沒有統計到的文件數

buckets:聚合結果,預設由高到低排列。key表示聚合元素的值,doc_count表示元素出現的次數。注意,這裡的doc_count也是不準確的

"""

mysql 常用查詢語句

1 在原有的時間欄位上做加減 1 減幾天date sub update bg outpatient test set test time date sub test time,interval 30 day where test time sysdate 2 加幾天adddate update bg...

MySql常用查詢語句

根據字段進行查詢 select nickname from os user where nickname biubiubiu 查詢os user account表中金額由大到小排名前三的使用者的所有資訊 select from os user account order by balance des...

oracle常用查詢語句

1 檢視oracle表空間的使用情況直接使用情況 2 檢視oracle連線數 select count from v session 連線數 select count from v session where status active 併發連線數 alter system set processe...