在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中,这些组合是等效的:
from elasticsearch_dsl.query import MultiMatch
MultiMatch(query='whatever you are looking for', fields=['title', 'content', 'footnote'])
Q('multi_match', query='whatever you are looking for', fields=['title', 'content', 'footnote'])
并且
Q('multi_match', query='whatever your are looking for', fields=['title', 'content', 'footnote'])
Q({'multi_match': {'query': 'whatever your are looking for', 'fields': ['title', 'content', 'footnote']}})
并且
q = Q('multi_match', query='whatever your are looking for', fields=['title', 'content', 'footnote'])
s.query(q)
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"})])
但我会让它更易于理解。可以在不同的表示形式之间进行权衡。
最后但并非最不重要的是,当您难以构建elasticsearch-dsl查询时,您可以始终使用elasticsearch_dsl.Search
类的from_dict()
方法回退到原始字典表示。