[英]ElasticSearch-dsl Create Query
大家好:
我一直在嘗試使用 ElasticSearch-dsl Search() 類來復制這個查詢,但不幸的是我沒能得到它。
我要復制的查詢是:
{
"_source": {
"includes": [ "SendingTime","Symbol","NoMDEntries","*"]
},
"from" : 0, "size" : 10000,
"query": {
"bool": {
"must": [
{
"range": {
"SendingTime": {
"gte": "Oct 3, 2018 08:00:00 AM",
"lt": "Oct 3, 2018 02:00:59 PM"
}
}
}
]
}
}
}
日期時間最終將被變量替換的地方。
到目前為止,我唯一能做的就是:
search = Search(using=elastic_search, index="bcs-md-bmk-prod")\
.query("bool", range= {"SendingTime" : {'gte': format_date(datetime.now() - relativedelta(days=1)), 'lt': format_date(datetime.now())}})\
我知道我離我想要的還很遠,所以如果有人能幫助我,我將不勝感激。
在elasticsearch-dsl中有多種方法可以構造相同的查詢,這是為了方便用戶,但有時(可能經常)讓新用戶更加困惑。
首先,每個原始查詢和 elasticsearch-dsl 查詢之間存在一對一的匹配。 例如,以下是等效的:
# 1
'query': {
'multi_match': {
'query': 'whatever you are looking for',
'fields': ['title', 'content', 'footnote']
}
}
# 2
from elasticsearch_dsl.query import MultiMatch
MultiMatch(query='whatever you are looking for', fields=['title', 'content', 'footnote'])
其次,這些對在 elasticsearh-dsl 中是等效的:
# 1 - using a class
from elasticsearch_dsl.query import MultiMatch
MultiMatch(query='whatever you are looking for', fields=['title', 'content', 'footnote'])
# 2 - using Q shortcut
Q('multi_match', query='whatever you are looking for', fields=['title', 'content', 'footnote'])
和
# 1 - using query type + keyword arguments
Q('multi_match', query='whatever your are looking for', fields=['title', 'content', 'footnote'])
# 2 - using dict representation
Q({'multi_match': {'query': 'whatever your are looking for', 'fields': ['title', 'content', 'footnote']}})
和
# 1 - using Q shortcut
q = Q('multi_match', query='whatever your are looking for', fields=['title', 'content', 'footnote'])
s.query(q)
# 2 - using parameters for Q directly
s.query('multi_match', query='whatever your are looking for', fields=['title', 'content', 'footnote'])
現在,如果我們回憶一下bool
查詢的結構,它由布爾子句組成,每個子句都有一個“類型化事件”(must、should、must_not 等)。 由於每個子句也是一個“查詢”(在您的情況下為range
查詢),它遵循與“查詢”相同的模式,這意味着它可以用 Q 快捷方式表示。
因此,我構建查詢的方式是:
search = Search(using=elastic_search, index="bcs-md-bmk-prod")
.query(Q('bool', must=[Q('range', SendingTime={"gte": "Oct 3, 2018 08:00:00 AM", "lt": "Oct 3, 2018 02:00:59 PM"})]))
.source(includes=["SendingTime","Symbol","NoMDEntries","*"])
請注意,為簡單起見,可以刪除第一個 Q,使該行:
.query('bool', must=[Q('range', SendingTime={"gte": "Oct 3, 2018 08:00:00 AM", "lt": "Oct 3, 2018 02:00:59 PM"})])
但我會保留它以便更容易理解。 隨意在不同的表示之間進行權衡。
最后但並非最不重要的,你可以隨時退回到使用原始字典表示from_dict()
的方法elasticsearch_dsl.Search
類,當你有困難,在建設elasticsearch-DSL的查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.