2016-12-14 12 views
1

は、それぞれが別々の文書である:ElasticSearchクエリ

{ 'PID':1、 'NM': 'トム'}、{ 'PID' {'pid':1、 'nm': 'harry'}、{'pid':2、 'nm': 'tom'}、{'pid':1、 'nm': 'dick' 2、 'nm': 'harry'}、{'pid':3、 'nm': 'dick'}、{'pid':3、 'nm': 'harry'}、{'pid':4、 「NM」:「ハリー」}

{ 
     "took": 137, 
     "timed_out": false, 
     "_shards": { 
      "total": 5, 
      "successful": 5, 
      "failed": 0 
     }, 
     "hits": { 
      "total": 8, 
      "max_score": null, 
      "hits": [ 
      { 
       "_index": "query_test", 
       "_type": "user", 
       "_id": "AVj9KS86AaDUbQTYUmwY", 
       "_score": null, 
       "_source": { 
        "pid": 1, 
        "nm": "Harry" 
       } 
      }, 
      { 
       "_index": "query_test", 
       "_type": "user", 
       "_id": "AVj9KJ9BAaDUbQTYUmwW", 
       "_score": null, 
       "_source": { 
        "pid": 1, 
        "nm": "Tom" 
       } 
      }, 
      { 
       "_index": "query_test", 
       "_type": "user", 
       "_id": "AVj9KRlbAaDUbQTYUmwX", 
       "_score": null, 
       "_source": { 
        "pid": 1, 
        "nm": "Dick" 
       } 
      }, 
      { 
       "_index": "query_test", 
       "_type": "user", 
       "_id": "AVj9KYnKAaDUbQTYUmwa", 
       "_score": null, 
       "_source": { 
        "pid": 2, 
        "nm": "Harry" 
       } 
      }, 
      { 
       "_index": "query_test", 
       "_type": "user", 
       "_id": "AVj9KXL5AaDUbQTYUmwZ", 
       "_score": null, 
       "_source": { 
        "pid": 2, 
        "nm": "Tom" 
       } 
      }, 
      { 
       "_index": "query_test", 
       "_type": "user", 
       "_id": "AVj9KbcpAaDUbQTYUmwb", 
       "_score": null, 
       "_source": { 
        "pid": 3, 
        "nm": "Dick" 
       } 
      }, 
      { 
       "_index": "query_test", 
       "_type": "user", 
       "_id": "AVj9Kdy5AaDUbQTYUmwc", 
       "_score": null, 
       "_source": { 
        "pid": 3, 
        "nm": "Harry" 
       } 
      }, 
      { 
       "_index": "query_test", 
       "_type": "user", 
       "_id": "AVj9KetLAaDUbQTYUmwd", 
       "_score": null, 
       "_source": { 
        "pid": 4, 
        "nm": "Harry" 
       } 
      } 
      ] 
     } 
    } 

そして私は、上記の例では3と4ですessentialyを探すことはどのれ、持っていたPIDの「ハリー」を見つける必要があると「トム」を持っていません同じpidを持つ文書のうち、どれも値が 'それらの少なくとも1つは値 'harry'を持つnmを持っています。

どのようにクエリを実行しますか?

EDIT:使用Elasticsearchバージョン5

答えて

1

あなたがboolを使用する可能性があります以下のようなものを、見ることができるPOSTリクエストボディがあれば何:

POST _search 
{ 
    "query": { 
    "bool" : { 
     "must" : { 
     "term" : { "nm" : "harry" } 
     }, 
     "must_not" : { 
     "term" : { "nm" : "tom" } 
     } 
    } 
    } 
} 
+0

分析されるフィールドで用語クエリを使用するのは危険ですか?その場合、マッピングが提供されない場合、nmが分析される。 – Artholl

+0

@Arthollもしあなたが 'not_analyzed'を使っているなら、上記のシナリオでそのフィールドを分析したくないのですか? – Kulasangar

+0

@Kulasangarは、このクエリで一致/フィルタ条件を同じドキュメントに適用しないでしょうか?しかしここでは、例えば、3つのドキュメントが同じpid、すなわち1を持ちますが、3つの異なる値は 'nm'です。 – harbinger

0

を私は比較的非常に新しいですElasticsearch、私は間違っているかもしれません。しかし、私はそのようなクエリを見たことがない。シンプルなフィルタは、望ましくない文書(集計ではなく)に適用されるものであるため、ここでは使用できません。私が見ているのは、 "Having"句(SQLの点で)を持つ "Group by"クエリを実行したいということです。しかし、クエリによるグループには、 "Having"節で使用されるいくつかの集計(すべてのフィールドの平均、最大、最小など)が含まれます。基本的には、集計結果の後処理にレデューサーを使用します。このようなクエリの場合は、バケットセレクタ集約を使用できます。 Read this
しかしあなたの場合は異なっています。任意のメトリック集計にHaving句を適用する必要はありませんが、「グループ化」データのフィールド(または列)に値があるかどうかを確認する必要があります。 SQLに関しては、 "グループ"で "where"クエリを実行する必要があります。これは私が一度も見たことのないものです。また、this
を読むこともできますが、アプリケーションレベルでは、クエリを壊すことで簡単に行うことができます。最初に、term aggを使用してnm = harryの一意のPIDを見つけます。次に、追加の条件nm!= tomを持つpidのドキュメントを入手します。

P.S.私はESにはとても新しいです。そして、もし私が1つの質問でこれを行う方法を示すことと矛盾するならば、私はとても幸せになれます。私もそれを学ぶでしょう。