2016-07-18 4 views
0

私はネストされた型を持っているマッピングを持っています。ネストされたオブジェクトは通常複数のオブジェクトを含んでいるので、メインオブジェクト全体が取り出されると配列になります。検索要求の「フィールド」部分を使用すると、メインオブジェクトのフィールドと、ネストされたオブジェクトのフィールド(1つしか存在しない場合は配列)を取得できますが、明らかにネストされたオブジェクト配列全体は取得できません。オブジェクト全体を取得する(フィールドを省略する)以外にこれを行う方法はありますか?Elasticsearchでは、オブジェクト全体がなくてもネストしたフィールド全体を返すにはどうすればよいですか?

たとえば、次のように一般的に

{ "properties: { "f1": {"type": "string"}, "f2": {"type": "string"}, ... "n": { "type": "nested", "properties": { "n1": {"type": "string"}, "n2": {"type": "string"}, ... } } } }

、n個の配列になりますが、n1はこのクエリが動作するすべてのエントリ

のために設定されますが、理由の一部で行方不明N1年代のすることはできません配列内のオブジェクトは、有用ではない:

{"query": {"nested": {"path": "n", "query": {"match": {"n.n1","something"}}}}, "fields": ["f1", "n.n1"]}

これは(「フィールド[n]はないありません葉のフィールド」)が、私は本当に欲しいものです:

{"query": {"nested": {"path": "n", "query": {"match": {"n.n1","something"}}}}, "fields": ["f1", "n"]}

しかし、これはありません、()の配列のnを含む全オブジェクトを取得犠牲に:

{"query": {"nested": {"path": "n", "query": {"match": {"n.n1","something"}}}}}

いくつかのクエリ構文がありますが、全体の配列n(およびメインオブジェクトの文字列フィールドの少なくとも1つ)を与えるでしょうか?

答えて

3

私が何をしたいことは、おそらく基本的にInner_Hitshttps://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-inner-hits.html#top-level-inner-hits

あなたはマッチしたそれぞれの「親」オブジェクトのために戻ってあなたのクエリに一致するだけで、ネストされたオブジェクトではなく、すべてのネストされたオブジェクトを、あなたを与えるクエリを行うことができますだと思いあなたの質問。

フラグを_source: falseと組み合わせて、あなたが探しているものが多かれ少なかれていると思います。ここで

は一例です。

"_source": "false", 
    "query": { 
     "match": { 
      "n.n1": "something" 
     } 
     }, 
    "inner_hits": { 
    "myname": { 
    "path": { 
     "n": { 
     "query": { 
      "match": { 
      "n.n1": "something" 
      } 
     } 
     } 
    } 
    } 
} 

トップレベルのクエリはあなたにn.n1 contains "something"任意の内部文書が含まれているすべての親のドキュメントを提供します。内側のクエリは、その配列をn.n1 contains "something"の内側の文書だけにフィルタリングします。実際にInner_hitsをフィルタリングする必要がない場合は、n1がnullの場合でもすべての値を入力したい場合は、内部ヒットクエリをmatch_allに変更します。何かが不明である場合、私に教えてください

{ 
    "_index": "myindex", 
    "_type": "mytype", 
    "_id": "theid", 
    "_score": 1, 
    "inner_hits": { 
     "myname": { 
     "hits": { 
      "total": 2, 
      "max_score": 2.4890606, 
      "hits": [ 
      { 
       "_index": "myindex", 
       "_type": "mytype", 
       "_id": "2", 
       "_nested": { 
       "field": "n", 
       "offset": 1 
       }, 
       "_score": 2.4890606, 
       "_source": { 
       "n1": "something", 
       "n2": "whatever" 
       } 
      }, 
      { 
       "_index": "myindex", 
       "_type": "mytype", 
       "_id": "3", 
       "_nested": { 
       "field": "n", 
       "offset": 0 
       }, 
       "_score": 2.4890606, 
       "_source": { 
       "n1": "something", 
       "n2": "great" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 

これはバックのような応答なものをお渡しします。

EDIT:私のコメントを1として

はここでは例です:

{ 

"fields": ["f1"], 
    "query": { 
    "match": { 
     "n.n1": "something" 
    } 
    }, 
    "inner_hits": { 
    "myname": { 
     "path": { 
     "n": { 
      "query": { 
      "match_all" : {} 
      } 
     } 
     } 
    } 
    } 
} 

クエリはあなたにn.n1は「何か」が含まれているすべての子を持つすべての親文書を与えること。 Innerヒットクエリは、n.n1が「何か」を含んでいないものを含む、親のすべての子孫を提供します。 fieldsフラグは、親文書に対して選択されたフィールドだけが返されることを意味します。

+0

残念ながら、名前が示唆するように、それはちょうどヒットを与える。私は、例の中の* whole *配列nを含むトップレベルオブジェクト全体のフィールドのサブセットの後に、nがマッチするものがあれば*です。私はこれを得ることができますが、特定の "フィールド"を求めないことによってのみ、興味のないデータをかなり多く取得しています。 – frankieandshadow

+0

"source:false"を設定する必要はなく、親から必要な他のすべてのフィールドに "fields:"フラグを使用することはできます。次に、ネストされたクエリをすべて一致として残します。 – Mic987

+0

しかし、それはちょうど私にヒットしたnを与え、同じオブジェクト内の他のものを省略しないのですか? – frankieandshadow

関連する問題