ElasticSearch-dsl Создать запрос - PullRequest
1 голос
/ 14 марта 2019

Привет всем:

Я долго пытался повторить этот запрос с помощью класса 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"
            }
          }
        }
      ]
    }
  }
}

Где datetime будет в конечном итоге заменен на переменную.

Пока единственное, что я смог сделать, это:

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())}})\

Я знаю, что я действительно далек от того, что я хочу получить, поэтому буду признателен, если кто-нибудь сможет мне помочь.

1 Ответ

1 голос
/ 15 марта 2019

Существует несколько способов создать один и тот же запрос в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.

...