2017-03-02 37 views
0

嵌套的文件看起來像這樣Elasticsearch 5.2多條件

{ 
    "userid": "123", 
    "usertag": [ 
     { 
      "tag": "A", 
      "logcreatetime": "2017-01-14" 
     }, 
     { 
      "tag": "C", 
      "logcreatetime": "2017-01-17" 
     } 
    ] 
}, 
{ 
    "userid": "456", 
    "usertag": [ 
     { 
      "tag": "A", 
      "logcreatetime": "2017-01-12" 
     }, 
     { 
      "tag": "B", 
      "logcreatetime": "2017-01-19" 
     } 
    ] 
}, 
..... 

usertag對象嵌套映射嵌套查詢, 如何通過2017年1月12日獲得用戶ID 2017年1月19日,有一個標籤和B? 謝謝 對不起,我的英語。

回答

0

我假設你已經收錄您的logcreatetime如日期字段,這樣你就可以使用下面的查詢:

curl -XGET http://localhost:9200/my_users/_search -d ' 
{ 
    "query": { 
    "bool": { 
     "must": [ { 
     "nested": { 
      "path": "usertag", 
      "query": { 
      "bool": { 
       "must": [ 
       { "match": { "usertag.tag": "A" }}, 
       { "range" : { 
        "usertag.logcreatetime" : { 
         "gte": "2017-01-12", 
         "lte": "2017-01-19" 
        } 
       }} 
       ] 
      } 
      } 
     } 
     }, { 
     "nested": { 
      "path": "usertag", 
      "query": { 
      "bool": { 
       "must": [ 
       { "match": { "usertag.tag": "B" }}, 
       { "range" : { 
        "usertag.logcreatetime" : { 
         "gte": "2017-01-12", 
         "lte": "2017-01-19" 
        } 
       }} 
       ] 
      } 
      } 
     } 
     }] 
    } 
    } 
}' 

語法的限制是,你可以尋找特定的子這兩個具有特殊taglogcreatetime在給定的範圍內。但爲了確保您有兩個孩子,您應該將兩個嵌套查詢合併爲頂級bool的2個必須的子句。

+0

感謝您的回答,但我很抱歉,我沒有說清楚。事實上,我的查詢中有兩個以上的TAG。沒有嵌套子查詢?再次感謝! – thirty

+0

我不認爲你可以結合嵌套查詢和子查詢,因爲它們使用兩種不同的數據結構。但是你可以嘗試做的是分離關注點:將與嵌套相關的信息與兒童相關聯分開存儲。你的情況是這樣嗎? –

+0

事實上,我需要一些標籤用戶的一段時間。然後看看他們在這段時間還有哪些標籤。用ES來得出這個結論似乎很難。我嘗試過各種數據結構。最接近的是嵌套結構,但仍然看起來與否。 – thirty