2016-07-22 10 views
0

ORedとなるANDedするプロパティの必須値を混合したいと思います。いくつかの有益なコメントの後、私は質問を言い換え、これを思い付いた:これはドキュメントがでCAT1とCAT2 OR CAT3を持たなければならないと言うん(「ブール値」と「しなければならない」形式)上記のクエリではElasticsearch ORingとANDingを "must"クエリで組み合わせました

GET /index/docs/_search 
{ 
    "size": 20, 
    "query": { 
     "bool": { 
      "must": [{ 
       "terms": { 
        "category": ["cat1", "cat2"] 
       }, 
       "terms": { 
        "category": ["cat3"] 
       } 
      }] 
     } 
    } 
} 

「カテゴリ」プロパティ

注:これは、元の質問から大幅に変更されています。

+2

'terms'クエリはすでにORクエリです。上記の例では、 'category'フィールドに' cat1' OR 'cat2'が含まれているドキュメントを取得します。あなたはそれを試しましたか? – Val

+0

OK、そしてその反対が質問になります。どのようにカテゴリを分類し、すべてを必要とするのですか?私はその質問に言い換えるつもりです。 – pferrel

答えて

0

複数の異なるタイプのクエリを結合するためにクエリをboolするために使用します。フィルターのような別の照会を追加する場合や、照会と同時に照会しない場合にのみ使用します。これでも動作しますが、単純な用語クエリに書き直されて、時間がかかります。

あなたがやりたいことについては、クエリーという用語で十分です。カテゴリにcat1またはcat2のいずれかを含むすべてのドキュメントが返されます。あなたには、いくつかの他のクエリとそれを組み合わせるしたい場合は、同様に照会しなければならないの内側に、この同じクエリを使用することができます

{ 
    "constant_score" : { 
     "filter" : { 
      "terms" : { "categories" : ["cat1", "cat2"]} 
     } 
    } 
} 

:よう

だからあなたのクエリだけである可能性があります。

thisthisを参照してください。

EDIT:他の場合、すなわち、次のクエリを使用できます。

本当にしたいことに応じて、あらゆる種類のクエリを組み合わせることができます。 elasticsearchクエリDSLのdocumnetationは私の意見ではかなり包括的です、あなたは一見をshoukd。また、thisを見て、あなたが望むことをするための多くの異なる方法があります。用語クエリは完全一致を検索することを念頭に置いてください。大文字と小文字は区別されますが、一致クエリは分析されたデータに依存しているため、結果はどちらの場合でも異なる場合があります。

+0

私は、問題はORedカテゴリまたはANDedカテゴリをどのように要求するのか理解しています。 @Valは質問の質問がORedであることを指摘したので、ANDedカテゴリを尋ねるためにそれを編集し、リストされたすべてのカテゴリがdocになければならないことを意味する。 – pferrel

+0

私は多くのドキュメントを読んだことがありますが、上記のことはありがとうございました。私が理解すれば、私は2つの言葉を(彼らは完全に一致し、アプリケーションで分析されていません)「必須」に入れることができます。その場合、「minimum_should_match:2」は必要ありませんか?または、 "should"の各部分の一致を強制して、ANDを達成しているものがminimum_should_matchですか?言い換えれば、別のカテゴリを追加すると 'minimum_should_match:3'とする必要があります。 – pferrel

+0

" should "を使用すると、minimum_should_matchを使用する必要があります。3つの節を使いたい場合は、基本的に少なくともどれくらいあなたの指定された句は文書になければなりません。何らかの部分一致が必要な場合に使用する必要があります。しかし、上記のvalと同様に、boolクエリーを使用する必要があります。また、minimum_should_matchを使用する必要はありません。mustは、指定されたすべての句が含まれている必要があるためです。私が言ったように、それをやるための他の多くの方法もあります。 – adityasinghraghav

0
最新のコメントによると

、あなたがしたい場合は、あなたのカテゴリー、行くための正しい方法はこのように、bool/mustを使用することです:

"query": { 
    "bool": { 
    "must": [ 
     { "match": { "category": "cat1" }}, 
     { "match": { "category": "cat2" }} 
    ] 
    } 
} 

bool/should + minimum_should_matchが働くだろう、あまりにも、しかしbool/mustはもっとありますあなたが持っている句の数を知る必要はありません。

+0

用語が(マテリアルを介して)1つのマッチに含まれている場合、それらはORedされ、別々のマッチでANDedされますか?私はこれを後方に持っていましたが、考えられた配列は異なった扱いを受けました。実験し、これに答えてマークします。 – pferrel

+0

ここのキーは** must **です。つまり、すべての句は一致する必要があります(= AND) – Val

+0

これで運がいいですか? – Val

関連する問題