Python連接es之查詢方式示例匯總
正文
上一節(jié)除了介紹使用 Python 連接 es,還有最簡單的 query() 方法,這一節(jié)介紹一下幾種其他的查詢方式。
1、query() 方法介紹
在上一節(jié)中介紹了 query() 的一個簡單示例,如下:
s = Search(using="default").index("exam") s = s.query("match", name="張三豐")
query() 中接受兩個參數(shù),第一個是字段查詢的方式,比如這里是 match,也可以是 term,這個依照查詢的目的來替換。
第二個則是查詢的字段與值,比如這里是查詢的 name 字段為 "張三豐" 的數(shù)據(jù)。
如果是有多個條件,比如 name="張三豐",address="中國" 的數(shù)據(jù),這里的 = ,并非是完全等于的意思,而是會依照前面的查詢方式,比如 match 或 term 進行類似的分詞或者模糊搜索。
如果是上面多個條件的查詢,可以直接在后面加上類似的 query():
s = s.query("match", name="張三豐").query("match", address="中國")
這兩個 query() 通過鏈?zhǔn)讲僮鬟B在一起轉(zhuǎn)換成 es 語句就是使用 must 將多條件連接在一起,我們可以使用 to_dict() 方式來查看:
s.to_dict() # {'query': {'bool': {'must': [{'match': {'name': '張三豐'}}, {'match': {'address': '中國'}}]}}}
2、Q() 查詢
如果看過之前我寫過的 Django 系列筆記,應(yīng)該記得在 Django 里也有個 Q() 方法的查詢,和這里的一樣,也是用于條件的聯(lián)合,與或非條件都可以實現(xiàn)。
引入方式如下:
from elasticsearch_dsl import Q
但是如果是在 Django 中使用 es 的連接,也是同樣使用 Q() 方法,我們可以使用 as 來區(qū)分,這里我們對于 es 的 Q() 方法可以使用 ES_Q() 來區(qū)分:
from elasticsearch_dsl import Q as ES_Q
單個條件的使用 Q() 如下:
s = s.query(ES_Q("match", name="張三豐"))
如下使用 dict 形式的操作也是等效的:
s = s.query(ES_Q({"match": {"name": "張三豐"}}))
與操作
對于這兩個條件,如果想要實現(xiàn)它們的與操作:
q1 = ES_Q("match", name="張三豐") q2 = ES_Q("match", address="中國")
可以如下實現(xiàn):
s = s.query(q1 & q2)
或操作
如果是想實現(xiàn)上面的或操作,可以如下:
s = s.query(q1 | q2)
非操作
如果是想取反,直接在條件前加一個 ~
即可:
q1 = ~ES_Q("match", name="張三豐") s = s.query(q1)
multi_match
如果是搜索多字段,可以如下操作:
q = ES_Q("multi_match", query="中國 張三豐", fields=["name", "address"]) s = s.query(q)
text.keyword 操作
對于 es 中 text 字段,前面我們介紹過 .keyword
的查詢方式,是將 text 字段作為一個整體進行查詢,在 ES_Q() 中,以下兩種操作是等效的:
q = ES_Q({"term": {"address.keyword": "中國湖北省"}}) q = ES_Q("term", address__keyword="中國湖北省")
filter() 操作
在 es 中的 filter 操作,在 Python 中是一個 filter() 函數(shù),可以直接使用:
q = ES_Q("term", name="張三豐") s = s.filter(q)
range 操作
實現(xiàn)大小于的操作示例如下:
q = ES_Q({"range": {"age": {"gte": 21}}}) s = s.query(q)
exclude() 操作
如果是想取反,除了使用 ~Q(),還可以直接使用 exclude() 函數(shù),這個和 Django 里的操作也是一樣的:
q = ES_Q("term", name="張三豐") s = s.exclude(q)
3、排序
如果是想對返回的結(jié)果進行排序操作,直接使用 .sort() 方法。
比如想對 age 字段排序,正序返回數(shù)據(jù),可如下操作:
s = s.sort("age")
如果是想倒序返回,可以如下操作:
s = s.sort("-age")
多字段排序直接在后面跟上就行:
s = s.sort("-age", "name")
4、分頁
Python 連接 es 進行分頁,可以直接使用 Python 里的切片操作,比如:
s = s[5:10]
5、source() 指定返回字段
我們可以通過 source() 方法指定返回的字段:
s = s.source(["name", "address"])
source() 方法還可以接受 includes 和 excludes 參數(shù)來指定返回的字段或者不返回的字段,這個和 es 的原生處理方式是一致的:
s = s.source( includes=["address"], excludes=["name"] )
6、extra() 操作
extra() 函數(shù)接受一些查詢的額外屬性,比如 size 參數(shù)決定返回條數(shù),比如 from 參數(shù)可以決定從第幾條數(shù)據(jù)開始返回,sort 參數(shù)決定排序方式,以及 _source 參數(shù)決定返回的字段。
比如我們想要返回的數(shù)據(jù)從第 2 條數(shù)據(jù)開始,返回兩條,按照 name 字段進行排序,只返回 name 和 _id 字段,可以如下操作:
s = Search(using="default").index("exam") s = s.extra( sort="name", _source=["name"], **{ "from": 1, "size": 2 } ) response = s.execute()
7、count() 總數(shù)
前面介紹過獲取符合條件的總數(shù),可以通過 response.hits.total.value 的方式獲得,其實對于 Search(),可以直接使用 count() 函數(shù):
count = s.count()
8、from_dict() 函數(shù)
如果我們想直接運行 kibana 里執(zhí)行的命令,可以使用 from_dict() 函數(shù),比如:
s = s.from_dict( { "query": { "term": { "name": { "value": "張三豐" } } } } )
以上就是Python連接es之查詢方式示例匯總的詳細內(nèi)容,更多關(guān)于Python連接es查詢方式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python中pytest命令行實現(xiàn)環(huán)境切換
在自動化測試過程中經(jīng)常需要在不同的環(huán)境下進行測試驗證,所以寫自動化測試代碼時需要考慮不同環(huán)境切換的情況,本文主要介紹了Python中pytest命令行實現(xiàn)環(huán)境切換,感興趣的可以了解一下2023-07-07關(guān)于ResNeXt網(wǎng)絡(luò)的pytorch實現(xiàn)
今天小編就為大家分享一篇關(guān)于ResNeXt網(wǎng)絡(luò)的pytorch實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01Python中類方法@classmethod和靜態(tài)方法@staticmethod解析
這篇文章主要介紹了Python中類方法@classmethod和靜態(tài)方法@staticmethod解析,python中存在三種方法,分別為常規(guī)方法(定義中傳入self)、@classmethod修飾的類方法、@staticmethod修飾的靜態(tài)方法,,需要的朋友可以參考下2023-08-08Python基于wordcloud及jieba實現(xiàn)中國地圖詞云圖
這篇文章主要介紹了Python基于wordcloud及jieba實現(xiàn)中國地圖詞云圖,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06