2016-11-16 9 views
1

私はこの後にElasticSearchを学んでいます - https://qbox.io/blog/using-elasticsearch-in-e-commerce-part-1記事。 elasticsearchのインデックス&は、次のCURLコマンドを実行して作成されました。PHPでElasticSearchクエリでSQL AND条件を使用するには?

curl -XPOST 'localhost:9200/ecomercedata/gadgets/_bulk?pretty' -d' 
{ "index": { "_id": 1 }} 
{ "name" : "MacBook Pro", "category" : "Laptop", "brand" : "Apple", "rating" : 9, "prize" : 1299.00, "piecesSold" : 9500, "dateOfRelease" : "2005-02-01"} 
{ "index": { "_id": 2 }} 
{"name" : "MacBook Air", "category" : "Laptop", "brand" : "Apple", "rating" : 8, "prize" : 1099.00, "piecesSold" : 8700, "dateOfRelease" : "2006-05-01"} 
{ "index": { "_id": 3 }} 
{"name" : "ATIV Book", "category" : "Laptop", "brand" : "Samsung", "rating" : 8, "prize" : 1899.00, "piecesSold" : 3500, "dateOfRelease" : "2014-05-01"} 
{ "index": { "_id": 4 }} 
{"name" : "Inspiron", "category" : "Laptop", "brand" : "Dell", "rating" : 6, "prize" : 700.00, "piecesSold" : 4600, "dateOfRelease" : "2008-03-01"} 
{ "index": { "_id": 5 }} 
{"name" : "Ipad", "category" : "Tablet", "brand" : "Apple", "rating" : 9, "prize" : 600.00, "piecesSold" : 9500 , "dateOfRelease" : "2005-07-01"} 
{ "index": { "_id": 6 }} 
{"name" : "Galaxy Tab", "category" : "Tablet", "brand" : "Samsung", "rating" : 8, "prize" : 550.00, "piecesSold" : 8500 , "dateOfRelease" : "2007-07-01"} 
{ "index": { "_id": 7 }} 
{"name" : "Lumia", "category" : "Mobile", "brand" : "Nokia", "rating" : 6, "prize" : 50.00, "piecesSold" : 12000 , "dateOfRelease" : "2009-03-01"} 
{ "index": { "_id": 8 }} 
{"name" : "Iphone", "category" : "Mobile", "brand" : "Apple", "rating" : 8, "prize" : 60.00, "piecesSold" : 28000 , "dateOfRelease" : "2002-03-01"} 
{ "index": { "_id": 9 }} 
{"name" : "Xperia", "category" : "Mobile", "brand" : "Sony", "rating" : 8, "prize" : 70.00, "piecesSold" : 24000 , "dateOfRelease" : "2004-03-01"}' 

フィールドマッピングスクリプトused-

curl -X PUT "http://localhost:9200/ecomercedata/gadgets/_mapping" -d '{ 
    "gadgets" : { 
    "properties" : { 
     "category" : { 
     "type" : "String", 
    "index" : "not_analyzed" 
     }, 
     "brand" : { 
     "type" : "String", 
    "index" : "not_analyzed" 
     }, 
     "name" : { 
     "type" : "String" 
     }, 
     "rating" : { 
     "type" : "Integer" 
     }, 
     "dateOfRelease" : { 
     "type" : "date", 
     "format" : "YYYY-mm-dd" 
     }, 
     "prize" : { 
     "type" : "Double" 
     }, 
     "piecesSold" : { 
     "type" : "Integer" 
     } 
    } 
    } 
}' 

私はElasticSearchからレコードをフェッチPHPto使用しています。ここに私のPHPスクリプトがあります。

<?php 
require 'vendor/autoload.php'; 

$hosts = [ 
    'http://localhost:9200',  // SSL to localhost 
]; 

$client = Elasticsearch\ClientBuilder::create()  // Instantiate a new ClientBuilder 
        ->setHosts($hosts)    // Set the hosts 
        ->build(); 

$params = [ 
      'index' => 'ecomercedata', 
      'type' => 'gadgets', 
      'body' => [ 
       'query' => [ 
         'constant_score' => [ 
          'filter' => [ 
           'bool' => [ 
            'must' => [ 
             'term' => [ 
              'category' => 'Laptop' 
             ], 
             'term' => [ 
              'brand' => 'Apple' 
             ] 
            ] 
           ] 
          ] 
         ] 
       ] 

      ] 
     ]; 

try { 
    $results = $client->search($params); 
} catch (Exception $e) { 
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
    exit; 
} 

echo '<pre>'; 
print_r($results); 
echo '</pre>'; 
?> 

基本的には、すべてのレコードを抽出しようとしています。category=laptop and brand=Appleです。しかし、それは私に正しい数のレコードを与えていない。入力されたデータセットによると、私は2レコードを取得する必要がありますが、私は4レコードを取得しています。このように、category and brandの条件はANDではなくORのようになります。

私は多くのグーグルグーグルをしました。しかし、私が間違っていることを理解することはできません。

答えて

2

あなたがそうでない場合は一方が他方によって上書きされます、独自の連想配列内の各termクエリをラップする必要があります。代わりにこのクエリを試してみてください。

$params = [ 
     'index' => 'ecomercedata', 
     'type' => 'gadgets', 
     'body' => [ 
      'query' => [ 
        'constant_score' => [ 
         'filter' => [ 
          'bool' => [ 
           'must' => [ 
            [ 
            'term' => [ 
             'category' => 'Laptop' 
            ] 
            ], 
            [ 
            'term' => [ 
             'brand' => 'Apple' 
            ] 
            ] 
           ] 
          ] 
         ] 
        ] 
      ] 

     ] 
    ]; 
+0

ええ、これは動作しています。私の間違いを知った。この助けをありがとう。 – mi6crazyheart

+0

うれしかった! – Val

2

boolはどこに置かれていても常にqueryで包む必要があります。 また、ご質問termが間違っています。彼らはそうのような、独自の配列にする必要があります:

[ 
    'constant_score' => [ 
     'filter' => [ 
      'query' => [ 
       'bool' => [ 
        'must' => [ 
         [ 
          'term' => [ 
           'category' => 'Laptop' 
          ] 
         ], 
         [ 
          'term' => [ 
           'brand' => 'Apple' 
          ] 
         ] 
        ] 
       ] 
      ] 
     ] 
    ] 
] 
+0

'' 'bool''は' '' '' '' '' 'の中にあるべきですか? – mi6crazyheart

+0

'constant_score/filter'は古い方法ですが、それでも正しいです。問題は異なります、他の答え;-) – Val

+0

ええ、この文書 - https://www.elastic.co/guide/en/elasticsearch/guide/current/_finding_multiple_exact_values.htmlによると、うまくいきます。 – mi6crazyheart

関連する問題