2016-07-22 5 views
0

Ich möchte die erforderlichen Werte der Eigenschaften zu UNDed ORed gemischt werden. Nach einigen hilfreichen Kommentare umformuliert ich die Frage und kam mit dieser:ElasticSE ORing und ANDing gemischt in "muss" Abfrage

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

In der Abfrage oben (mit einem „Bool“ „Muss“ Form) sagt dies, dass ein Dokument haben, MÜSSEN cat1 UND cat2 ODER cat3 in die Eigenschaft "Kategorie"?

HINWEIS: Dies ist erheblich von der ursprünglichen Frage geändert.

+2

Die Abfrage 'terms' ist bereits eine ODER-Abfrage. In obigem Beispiel erhalten Sie Dokumente, deren 'category' Feld' cat1' oder 'cat2' enthält. Hast du es ausprobiert? – Val

+0

ok, dann wird das Gegenteil zur Frage, wie mache ich UND die Kategorien, die alle von ihnen verlangen. Ich werde die Frage neu formulieren. – pferrel

Antwort

0

Sie verwenden, um Abfrage zu bündeln, um mehrere verschiedene Arten von Abfragen zusammen zu kombinieren. Sie würden es wie Sie nur verwenden, wenn Sie eine weitere Abfrage wie einen Filter hinzufügen oder nicht usw. zusammen mit Ihrer Terms-Abfrage hinzufügen möchten. Dies wird immer noch funktionieren, aber es wird einfach in eine einfachere Terms-Abfrage umgeschrieben, die mehr Zeit braucht.

Die Begriffe Abfrage ist ausreichend für was Sie tun möchten und es werden alle Dokumente zurückgeben, die entweder Cat1 oder Cat2 in Kategorien enthalten.

So könnte Ihre Abfrage nur wie:

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

Sie dieselbe Abfrage innerhalb einem verwenden kann, muss auch abfragen, wenn Sie es mit einer anderen Abfrage kombinieren mögen.

Werfen Sie einen Blick auf this und this als Referenz.

BEARBEITEN: Für den anderen Fall, dh. und Sie könnten die folgende Abfrage verwenden:

"query": { 
    "bool": { 
     "should": [ 
     { "match": { "category": "cat1" }}, 
     { "match": { "category": "cat2" }} 
    ], 
     "minimum_should_match": 2 
    } 
    } 

Sie können alle Arten von Abfragen kombinieren, um je nachdem, was Sie wirklich tun wollen. Die ElasticSearch Query DSL Documnetation ist meiner Meinung nach ziemlich umfangreich, man sollte sich einen Blick darauf werfen. Schauen Sie sich auch this an, es gibt viele verschiedene Möglichkeiten, das zu tun, was Sie wollen. Denken Sie daran, dass die Begriffssuche nach genauen Übereinstimmungen sucht, d. Groß-und Kleinschreibung, während die Match-Abfragen auf analysierten Daten beruhen, so kann das Ergebnis in beiden Fällen unterschiedlich sein.

+0

Ich verstehe, die Frage ist, wie OR-Kategorien oder ANDed-Kategorien erfordern. @Val wies darauf hin, dass die Abfrage in der Frage OR-verknüpft war, also habe ich sie bearbeitet, um nach UND-Kategorien zu fragen, was bedeutet, dass alle aufgelisteten Kategorien im Dokument enthalten sein müssen. – pferrel

+0

Ich habe viel von den Dokumenten gelesen, aber würde nie das oben genannte war ein UND so danke. Wenn ich verstehe, könnte ich die 2 Begriffe (sie sind genau Übereinstimmungen und in der Anwendung nicht analysiert) in ein "Muss" setzen, in welchem ​​Fall ich nicht das "Minimum_Schuldmuster_2" brauchen würde? Oder ist das minimum_should_match das, was das AND erreicht, indem eine Übereinstimmung für jeden Teil des "sollte" erzwungen wird?Mit anderen Worten, wenn ich eine andere Kategorie hinzufügen würde, müsste ich 'minimum_should_match: 3' machen. – pferrel

+0

Wenn Sie" sollte "verwenden, müssen Sie minimum_should_match: 3 verwenden, wenn Sie 3 Klauseln verwenden möchten, die im Grunde mindestens wie viele angibt Ihre angegebenen Klauseln müssen im Dokument enthalten sein. Sollte verwendet werden, wenn Sie irgendeine Art von Teilabgleich wünschen. Allerdings, wie Val oben genannten müssen mit einer Bool-Abfrage funktioniert auch und dann müssten Sie nicht die Minimum_should_match als müssen bedeutet, dass das Dokument alle angegebenen Klauseln enthalten muss. und wie ich schon sagte, gibt es auch viele andere Möglichkeiten, dies zu tun. – adityasinghraghav

0

Nach Ihrer letzten Kommentar, wenn Sie und Ihre Kategorien möchten, ist der richtige Weg zu gehen, ist durch bool/must verwenden, wie folgt aus:

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

bool/should + minimum_should_match würde auch funktionieren, aber bool/must ist mehr unkompliziert und erfordert nicht, dass Sie wissen, wie viele Klauseln Sie haben.

+0

Wenn die Begriffe in einer einzigen Übereinstimmung (über das Array) sind, werden sie ODER verknüpft, in separaten Übereinstimmungen werden sie UND-verknüpft? Ich hatte das rückwärts, dachte aber, Arrays würden anders behandelt. Wird experimentieren und dies als beantwortet markieren. – pferrel

+0

Der Schlüssel hier ist ** müssen **, d. H. Alle Klauseln müssen übereinstimmen (= AND) – Val

+0

irgendein Glück damit? – Val

Verwandte Themen