2016-04-11 3 views
1

ネストフィールドタイプの最初のアイテムで検索するにはどうすればelasticsearchのリストですか?ネストフィールドの最初のアイテムで検索リスト<object> elasticsearch

public class Data 
{ 
    public int Id{get;set;} 
    public string Name{get;set;} 
    public List<History> Logs{get;set;} 
} 
public class History 
{ 
    public byte Status { get; set; } 
    public string Note { get; set; } 
    public DateTime DateProcessed { get; set; } 
} 

例、私はなどのような3つのレコードを持っている:今

PUT /my_index/Data/1 
{ 
    "name": "name 1", 
    "logs": [ 
    { 
     "status": "2", 
     "note": "processed", 
     "dateProcessed": "2016-04-11" 
    }, 
    { 
     "status": "1", 
     "note": "new", 
     "dateProcessed": "2016-04-10" 
    } 
    ] 
} 

PUT /my_index/Data/2 
{ 
    "name": "name 2", 
    "logs": [ 
    { 
     "status": "1", 
     "note": "new", 
     "dateProcessed": "2016-04-11" 
    } 
    ] 
} 

PUT /my_index/Data/3 
{ 
    "name": "name 2", 
    "logs": [ 
    { 
     "status": "3", 
     "note": "error", 
     "dateProcessed": "2016-04-11" 
    }, 
    { 
     "status": "1", 
     "note": "new", 
     "dateProcessed": "2016-04-10" 
    } 
    ] 
} 

を、私は、上記の例では1 等しい状態で、リストの最初の項目(フィールドログ)を持つレコードを取得したいです結果は2番目のレコードです。 お手伝いをしてください、ありがとう!

答えて

0

あなたはScript Queryですが、それは非常に遅くなります。

{ 
"filter": { 
    "script": { 
     "script": "_source.logs?.first()?.status.equals('1')" 
     } 
    } 
} 

enable scripting

0

にあなたはNested Queryのように思える行くべき道を確認してください。

マッピング時にリストをネストとして定義する必要があります。次に、ネストされたクエリを書き込んで、 "履歴"の内部ヒットに応じて "データ"をフィルタリングすることができます。

関連する問題