2016-12-21 16 views
1

私はelasticsearchで何かをしようとしています。Elasticsearch:フィルタリングされたネストされたフィールドのスクリプト化された合計でフィルタリング

は、ネストされたオブジェクトの製品を手に入れた:

"products": { 
    "include_in_root": true, 
    "type": "nested", 
    "properties": { 
     "date": { 
     "format": "strict_date_optional_time||epoch_millis", 
     "type": "date" 
     }, 
     "type": { 
     "index": "not_analyzed", 
     "type": "string" 
     }, 
     "cat4": { 
     "index": "not_analyzed", 
     "type": "string" 
     }, 
     "geo": { 
     "type": "geo_point" 
     }, 
     "baseprice": { 
     "type": "long" 
     }, 
     "cat2": { 
     "index": "not_analyzed", 
     "type": "string" 
     }, 
     "cat3": { 
     "index": "not_analyzed", 
     "type": "string" 
     }, 
     "feeltemp": { 
     "type": "long" 
     }, 
     "cat1": { 
     "index": "not_analyzed", 
     "type": "string" 
     }, 
     "price": { 
     "type": "double" 
     }, 
     "qty": { 
     "index": "not_analyzed", 
     "type": "string" 
     }, 
     "name": { 
     "index": "not_analyzed", 
     "type": "string" 
     }, 
     "weather": { 
     "index": "not_analyzed", 
     "type": "string" 
     }, 
     "id": { 
     "index": "not_analyzed", 
     "type": "string" 
     }, 
     "stock": { 
     "type": "long" 
     }, 
     "brand": { 
     "index": "not_analyzed", 
     "type": "string" 
     } 
    } 
    } 

私はタイプが=「cartadd」と例えばCAT1 =「テスト」場合にのみ、それらを照会します。

問題、ネストされたフィルタとクエリがあれば:

{ 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "nested": { 
      "path": "products", 
      "filter": { 
       "bool": { 
       "must": [ 
        { 
        "script": { 
         "script": "sum=0;for(obj in _source.products) {sum = sum + 1 }; sum>=1;" 
        } 
        }, 
        { 
        "term": { 
         "products.type": "view" 
        } 
        } 
       ] 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

それは何をカウントしません。

私は、ネストされた運転削除する場合:

{ 
    "query": { 
    "bool": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "script": { 
       "script": "sum=0;for(obj in _source.products) {if(obj.type=='cartadd') {sum = sum + obj.price }}; sum>=2;" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

それが動作すると、オブジェクトを数えます。しかし、私はもはやネストしたオブジェクトをフィルタリングできません。

groovyスクリプトでif条件を追加しましたが、私は動的に追加された条件をさらに多く持つことができます。

どうすればいいですか?

ありがとうございます!

{ 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "script": { 
      "script": "sum=0;for(obj in _source.products) {sum = sum + 1 }; sum>=1;" 
      } 
     }, 
     { 
      "nested": { 
      "path": "products", 
      "filter": { 
       "term": { 
       "products.type": "view" 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

のほかに、良いアイデアが希望:

答えて

1

は、あなたはそれがproducts上で動作しているので、親文書のフィールド(ないネストされたもの)であるnestedクエリの外scriptフィルタを移動する必要があります製品オブジェクトの数を含む親文書にnbProductsという新しいフィールドを追加することが必要です。そうすれば、そのスクリプトを取り除き、次のような単純なクエリを実行することができます:

{ 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "range": { 
      "nbProducts": { 
       "gte": 1 
      } 
      } 
     }, 
     { 
      "nested": { 
      "path": "products", 
      "filter": { 
       "term": { 
       "products.type": "view" 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 
} 
+0

ありがとうございました。問題は次のとおりです。 >最初のソリューションでは、すべての製品がカウントされますが、type = viewでフィルタリングされません。 > 2番目のソリューションでは、nbProductsは動的ではありません。私は他の多くのフィルタを追加する必要があります。 – Kaliseo

+0

だから、あなたは 'products.type = view'条件に合った製品だけを数えたいと思っていますか?それは本質的なものです。ネストされた 'products'マッチが1つあれば、少なくとも1つがマッチしているので、製品数は必然的に> = 1です。より多くの条件がある場合は、それらを 'nested'クエリの' bool/filter'に追加することができます。 – Val

関連する問題