Существует несколько способов создать один и тот же запрос вasticsearch-dsl, что для удобства пользователей, но иногда (возможно, часто) вводит новых пользователей в замешательство.
Во-первых, существует взаимно-однозначное соответствие между каждым необработанным запросом и запросомasticsearch-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'])
Во-вторых, эти пары эквивалентны вasticsearh-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='elastic python', 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, must, must_not и т. Д.). Поскольку каждое предложение также является «запросом» (в вашем случае range
query ), оно следует тому же шаблону, что и «запрос», что означает, что оно может быть представлено ярлыком 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"})])
но я использовал это, чтобы легче было понять. Не стесняйтесь выбирать между различными представлениями.
И последнее, но не менее важное: вы всегда можете вернуться к необработанному представлению dict, используя метод from_dict()
класса elasticsearch_dsl.Search
, когда вам сложно построить запрос вasticsearch-dsl.