2017-05-30 77 views
0

我有一個稱爲經驗字段用戶文件,它是對象的數組,如:Elasticsearch連接範圍和術語,以相同的數組項

{ 
    "experiences": [ 
    { 
     "end_date": "2017-03-02", 
     "is_valid": false 
    }, 
    { 
     "end_date": "2015-03-02", 
     "is_valid": true 
    } 
    ] 
} 

有了這個文檔我要搜索的用戶,其中端日期在去年,is_valid是真的。 在這個時候我有一個查詢 - > BOOL我添加兩個必須有,一個範圍END_DATE併爲is_valid一個長期

{ 
    "query": { 
    "bool": { 
     "must": { 
     "term": { 
      "experiences.is_valid": true 
     }, 
     "range": { 
      "experiences.end_date": { 
      "gte": "now-1y", 
      "lte": "now" 
      } 
     }, 
     } 
    } 
    } 
} 

其結果是,該用戶被選中是因爲他在去年END_DATE(第一EXP)和另外一個EXP。與is_valid true。 當然這不是我所需要的,因爲我需要的是end_dateis_valid必須被引用到同一個對象,但我們如何在Elasticsearch上做到這一點?

映射

"experiences": { 
    "properties": { 
    "comment": { 
     "type": "text", 
     "fields": { 
     "keyword": { 
      "type": "keyword", 
      "ignore_above": 256 
     } 
     } 
    }, 
    "end_date": { 
     "type": "date" 
    }, 
    "id": { 
     "type": "long" 
    }, 
    "is_valid": { 
     "type": "boolean" 
    }, 
    "start_date": { 
     "type": "date" 
    } 
    } 
} 
+0

您的索引共享映射..'GET index/type/_mapping'。我想經驗是'對象'類型的。 – Richa

+0

新增,但沒有「類型」的經驗... – Grork

+1

默認爲「對象」.. :) – Richa

回答

3

您需要更改experiences類型Nested data type

然後應用nested查詢:

{ 
"query": { 
    "nested": { 
    "path": "experiences", 
    "query": { 
     "bool": { 
      "must": [ 
       { 
       "term": { 
        "experiences.is_valid": true 
       } 
       }, 
       { 
       "range": { 
        "experiences.end_date": { 
         "gte": "now-1y", 
         "lte": "now" 
        } 
       } 
       } 
      ] 
     } 
    } 
    } 
    } 
} 

這是由於物體的陣列中Elasticsearch被平坦化的方式。 學習更多here

+0

謝謝,我會在接下來的幾天嘗試! – Grork