簡體   English   中英

ElasticSearch-dsl 創建查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM