2016-12-13 8 views
3

私はelasticsearchインスタンスでインデックス化したサンプル製品(2)のデータです。私が何をしたいか複数の条件でElasticsearchからデータを取得

[{ 
    "type": "mobile", 
    "name": "iPhone 7s", 
    "price": 70000, 
    "brand_id": "100", 
    "spec": [{ 
     "id": 200,   // brand id 
     "value": "apple" 
    }, { 
     "id": 201,   // color id 
     "value": "black" 
    }, { 
     "id": 202,   // battery size id 
     "value": "2200" 
    }] 
}, { 
    "type": "mobile", 
    "name": "Samsung Galaxy 5S", 
    "price": 50000, 
    "brand_id": "101", 
    "spec": [{ 
     "id": 200, 
     "value": "samsung" 
    }, { 
     "id": 201, 
     "value": "silver" 
    }, { 
     "id": 202, 
     "value": "3200" 
    }] 
}] 

は「ブランドは」 'サムスン&「色」「銀」と等しいだろうすべての携帯電話のデータをフェッチする、です。

私はElasticsearchとの通信にPHPを使用しています。ここでは、すべての 'サムスン'携帯電話を弾力性から戻すサンプルのPHPスクリプトです。

$params = [ 
      'index' => 'index name', 
      'type' => 'products', 
      'from' => $start, 
      'size' => $limit, 
      'body' => [ 
       'query' => [ 
        'bool' => [ 
         'must' => [ 
          'match' => [ 
           'type' => 'mobile' 
          ] 
         ], 
         [ 
          'nested' => [ 
           'path' => "spec", 
           "score_mode" => "max", 
           'query' => [ 
            'bool' => [ 
             'must' => [ 
              [ 
               'match' => [ 
                "spec.id" => 200 
               ] 
              ], 
              [ 
               'match' => [ 
                "spec.value" => 'samsung' 
               ] 
              ] 
             ] 
            ] 
           ] 
          ] 
         ] 
        ] 
       ] 
      ] 
     ]; 

$result = $client->search($params); 

しかし、「色」フィールドの条件を含める方法もわかりません。それで、私はすべての 'Samsung'の携帯電話を「黒い」色しか持たない。

+0

まず、 'spec'フィールドが[' nested' type](https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html)であることを確認する必要があります。それは事実ですか? – Val

+0

これは、インデックスのマッピング時にすでに行っています。 – mi6crazyheart

答えて

1

あなたspecフィールドが正しくnestedフィールドとしてマッピングされているので、あなたは、単に(すなわちbool/must 1内nestedクエリを移動し、カラー制約のために別のものを作成する)このようなあなたのクエリを変更する必要があります。

$params = [ 
      'index' => 'index name', 
      'type' => 'products', 
      'from' => $start, 
      'size' => $limit, 
      'body' => [ 
       'query' => [ 
        'bool' => [ 
         'must' => [ 
          [ 
          'match' => [ 
           'type' => 'mobile' 
          ] 
          ], 
          [ 
          'nested' => [ 
           'path' => "spec", 
           "score_mode" => "max", 
           'query' => [ 
            'bool' => [ 
             'must' => [ 
              [ 
               'match' => [ 
                "spec.id" => 200 
               ] 
              ], 
              [ 
               'match' => [ 
                "spec.value" => 'samsung' 
               ] 
              ] 
             ] 
            ] 
           ] 
          ] 
          ], 
          [ 
          'nested' => [ 
           'path' => "spec", 
           "score_mode" => "max", 
           'query' => [ 
            'bool' => [ 
             'must' => [ 
              [ 
               'match' => [ 
                "spec.id" => 201 
               ] 
              ], 
              [ 
               'match' => [ 
                "spec.value" => 'black' 
               ] 
              ] 
             ] 
            ] 
           ] 
          ] 
          ], 
         ] 
        ] 
       ] 
      ] 
     ]; 

$result = $client->search($params); 
+0

うわー!!!それは働いている。私を助けてくれてありがとう。今私はここからこれを取ることができます。 – mi6crazyheart

+0

うれしかった! – Val

関連する問題