2017-10-16 90 views
0

下面是一個查詢,該查詢應該返回整個指定用戶名爲'mike'的當前日期的所有信息。 (正如你所看到的,我使用通配符將所有用戶稱爲邁克,並在邁克之後的任何名稱,這是我想要的。)查詢沒有返回正確的數據

因此,數據正在爲當前日期返回,但是,通配符是無法正常工作,它爲所有用戶帶來的數據不僅僅是麥克風。

有人可以幫助我我真的需要通配符才能工作。

我的代碼:

GET_search 
    { 
     "_source": [ 
     "N" 
     ], 
     "query": { 
     "bool": { 
      "should": [ 
      { 
       "wildcard": { 
       "N": "mike*" 
       } 
      } 
      ], 
      "must": [ 
      { 
       "range": { 
       "VT": { 
        "gte": "now/d", 
        "lte": "now+1d/d" 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 

回答

1

你的問題不是wildcard查詢,但事實證明,這是一個should列表。在the bool query docs,它說:

如果布爾查詢是在查詢方面,具有葡萄汁或篩選子句那麼文件將匹配即使沒有任何的應查詢匹配的布爾查詢。

這就是你的情況。你可以簡單地通過通配符查詢移動到必須列出,這樣解決這個問題:

{ 
    "_source": [ 
    "N" 
    ], 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "range": { 
      "VT": { 
       "gte": "now/d", 
       "lte": "now+1d/d" 
      } 
      } 
     }, 
     { 
      "wildcard": { 
      "N": "mike*" 
      } 
     } 
     ] 
    } 
    } 
} 

它也將努力保持should加1的minimum_should_match,但我想不出任何比較好的理由要做到這一點。

+0

謝謝你解釋,你的代碼正在爲我工​​作!非常感謝。我想問一下是否有一種方法可以在一段時間內過濾E.G現在它能夠將今天的所有數據都帶回來,這很好,但是有沒有辦法只在今天的上午11點到下午2點之間才提供數據? – Rich

+0

我也upvoted並打勾你的答案是正確的! – Rich

+0

是的 - 你可以使用精確的日期,如「2017-10-16T11:00」(格式取決於你的映射,但這是默認的),或者如果你想要相對的,「now/d + 11h」。請參閱[日期數學文檔](https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#date-math)。 – dshockley