2016-05-18 7 views
0

elasticsearchのクエリを作成しようとしています。条件:常に顧客フィルタがあります。一致した場合に最高得点を作成するフィールド「名前」があり、次の最善のフィールドは「カテゴリ」、次に「説明」でなければなりません。しかし、 "name"や "category"ではなく、 "description"でのみ検索されても結果は返されます。私が試した何elasticsearch:複数のフィールドのブースト

 $query = [ 
     'filtered' => [ 
      'filter' => [ 
       'term' => [ 'customer' => $selectedCustomer ] 
      ], 
      'query' => [ 
       'bool' => [ 
        'should' => [ 
         'match' => [ 
          'name' => [ 
           'query' => $val, 
           'boost' => 7 
          ] 
         ] 
        ], 
        'should' => [ 
         'match' => [ 
          'category' => [ 
           'query' => $val, 
           'boost' => 3 
          ] 
         ], 
        ], 
        'should' => [ 
         'match' => [ 
          'description' => [ 
           'query' => $val, 
           'boost' => 1 
          ] 
         ], 
        ], 
       ] 
      ] 
     ] 
    ]; 

しかし、これは、「説明」の試合で唯一の結果を返すように思われます。私は間違って何をしていますか?何かヒント?

+0

この3つのシリーズは、3つの「一致」を含む1つの配列を作成していますか? { "べき":[ { "一致":{ "フィールド": "TEXT" } }、 { "一致":{ "フィールド":「TEXT( ' "ブール" 等今、私は理にかなって、もちろん、それを見ていること」 }} 、 {} ... ] } ') –

+0

....ええ、。しかし、どうすればそれを正しく行うことができますか? – Chi

+0

私はphpを知らないが、私はそのクエリがどのように見えるのかは確信している。 –

答えて

0

私はこのようにそれを実行して最初の問題への解決策を見つけたように思える:

 $query = [ 
     'filtered' => [ 
      'filter' => [ 
       'term' => [ 'customer' => $selectedCustomer ] 
      ], 
      'query' => [ 
       'bool' => [ 
        'should' => [ 
         ['match' => [ 
          'name' => [ 
           'query' => $val, 
           'boost' => 7 
          ] 
         ]], 
         ['match' => [ 
          'category' => [ 
           'query' => $val, 
           'boost' => 5 
          ] 
         ]], 
         ['match' => [ 
          'description' => [ 
           'query' => $val, 
           'boost' => 1 
          ] 
         ]], 

        ], 
       ] 
      ] 
     ] 
    ]; 

次の問題は、しかし、これが唯一の全体の言葉のために一致して見つけたということです。同様に、$ val = 'bread'の場合、単語「bread」を含むすべての一致を取得しますが、「gingerbread」のようなものは取得しません。誰にでもこれに対する解決策は分かりますか?

関連する問題