2016-04-28 18 views
1

を考える:二つの異なるタイプのElasticsearchのクエリまたはフィルタで、特定のドキュメントタイプのフィールドを指定する方法はありますか?

  1. ドキュメント、のは、「製品」と「カテゴリ」は、同じElasticsearchインデックスに連動しているとしましょう。
  2. 両方のドキュメントタイプにフィールド 'タグ'があります。

問題:

私は両方のタイプの結果を返すクエリを構築したいのですが、型「製品」の文書は、タグ「X」と「Y」を持つことが許されており、タイプ 'category'の文書はタグ 'Z'しか持てません。どうすればこれを達成できますか? ESは私が意図していない文書の製品/カテゴリフィールドを探すので、product.tagsとcategory.tagsを使用することはできません。

注:

上記の例のための回避策のいくつかの種類があるかもしれませんが、私は、クエリを記述する際、特定のドキュメントタイプのフィールドをターゲットまたは指定する一般的な方法を探しています。私は基本的に私のクエリで使用されるフィールド名を '名前空間'にしたいので、私が扱いたいタイプの文書だけが考慮されます。

答えて

1

私はフィールドエイリアシングがあなたにとって最良の答えだと思いますが、それは不可能です。 は、代わりに、「copy_to」を使用することができますが、私はおそらく、インデックスのサイズに影響します。

DELETE /test 
PUT /test 
{ 
     "mappings": { 
      "product" : { 
       "properties": { 
       "tags": { "type": "string", "copy_to": "ptags" }, 
       "ptags": { "type": "string" } 
      } 
      }, 
      "category" : { 
       "properties": { 
       "tags": { "type": "string", "copy_to": "ctags" }, 
       "ctags": { "type": "string" } 
      } 
     } 
    } 
} 

PUT /test/product/1 
{ "tags":"X" } 
PUT /test/product/2 
{ "tags":"Y" } 
PUT /test/category/1 
{ "tags":"Z" } 

をそして、あなたはフィールドのいずれかを照会したりすることができ、それらの多く:あなたの答えのための

GET /test/product,category/_search 
{ 
    "query": { 
     "term": { 
      "ptags": { 
       "value": "x" 
      } 
     } 
    } 
} 

GET /test/product,category/_search 
{ 
    "query": { 
     "multi_match": { 
     "query":  "x", 
     "fields":  [ "ctags", "ptags" ] 
     } 
    } 
} 
+0

おかげで、しかし、問題がありますあなたの最初の例では、 'product.tags'と 'category.tags'は、それぞれの候補ドキュメントで、product/typeのドキュメントのfield .tagsの代わりに.product.tagsと.category.tagsフィールドを試してみるようです。カテゴリ... – Asciiom

+0

IMHすべての文書でESが内部的に "product.tags"を検索し、すべての文書で "category.tags"を検索するかどうかは関係ありません。結果はOKです。 2番目の例は最初の例と同じで、同じ動作をしていますが、ESの内部実装についての知識はありません。 私はあなたの意図を正確に理解できない可能性がありますか? –

+1

それは可能ですが、ポイントは、同じ名前のフィールドを含む2つのdocタイプがあり、フィールドが属するdoctypeに応じて問合せ内で(別の理由で)それらを別々に使用する場合は、両者を区別する方法。ドット表記法を使った明白なアプローチはうまくいかないようです。 – Asciiom

関連する問題