Ich versuche derzeit, eine solr-basierte Anwendung auf elasticsearch zu migrieren.
Ich habe diese Lucene-Abfrage
((
name:(+foo +bar)
OR info:(+foo +bar)
)) AND state:(1) AND (has_image:(0) OR has_image:(1)^100)
Soweit ich weiß, handelt es sich um eine Kombination von MUST-Klauseln in Kombination mit einem booleschen ODER:
"Holen Sie sich alle Dokumente, die (foo UND Balken im Namen) ODER (foo UND Balken im Info) enthalten. Danach werden die Filter nach Bedingungsstatus = 1 gefiltert und Dokumente mit einem Bild angehoben."
Ich habe versucht, eine Bool-Abfrage mit MUST zu verwenden, aber ich kann kein boolesches ODER in must-Klauseln einfügen. Folgendes habe ich:
GET /test/object/_search
{
"from": 0,
"size": 20,
"sort": {
"_score": "desc"
},
"query": {
"bool": {
"must": [
{
"match": {
"name": "foo"
}
},
{
"match": {
"name": "bar"
}
}
],
"must_not": [],
"should": [
{
"match": {
"has_image": {
"query": 1,
"boost": 100
}
}
}
]
}
}
}
Wie Sie sehen können, fehlen MUSS-Bedingungen für "Info".
Hat jemand eine Lösung?
Ich danke dir sehr.
** UPDATE **
Ich habe meine Elasticsearch-Abfrage aktualisiert und diese Funktionsbewertung entfernt. Mein Basisproblem besteht immer noch.
quelle
Antworten:
Beispiel:
Sie möchten alle Elemente sehen, die sind (rund UND (rot ODER blau)):
Sie können auch komplexere Versionen von OR ausführen. Wenn Sie beispielsweise mindestens 3 von 5 übereinstimmen möchten, können Sie unter "sollte" 5 Optionen angeben und ein "Minimum_should" von 3 festlegen.
Vielen Dank an Glen Thompson und Sebastialonso, die herausgefunden haben, wo meine Verschachtelung vorher nicht ganz richtig war.
Vielen Dank auch an Fatmajk für den Hinweis, dass "Begriff" in ElasticSearch 6 zu "Übereinstimmung" wird.
quelle
should
in die obere Ebene ziehenbool
und eineminimum_should_match: 1
Arbeit einschließen ?[term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]
. Ist das irgendwie versionabhängig?minimum_should
1, und das Umschließenbool
führt dazu, dass diese Gruppe wahr ist, wenn mindestens ein Element übereinstimmt, und falsch, wenn keines übereinstimmt. Meine Motivation für die Erstellung dieser Antwort war, dass ich genau diese Art von Problem löste und die verfügbare Dokumentation und sogar die Antworten, die ich auf solchen Websites finden konnte, bestenfalls nicht hilfreich waren. Deshalb recherchierte ich weiter, bis ich das Gefühl hatte, einen ziemlich soliden Überblick zu haben von dem, was los war. Ich freue mich über konstruktive Hinweise, wie ich die Antwort weiter verbessern kann.Ich habe es endlich geschafft, eine Abfrage zu erstellen, die genau das tut, was ich haben wollte:
Eine gefilterte verschachtelte boolesche Abfrage. Ich bin mir nicht sicher, warum dies nicht dokumentiert ist. Vielleicht kann mir hier jemand sagen?
Hier ist die Abfrage:
In Pseudo-SQL:
Bitte beachten Sie, dass es von Ihrer Dokumentenfeldanalyse und den Zuordnungen abhängt, wie name = foo intern behandelt wird. Dies kann von einem unscharfen bis zu einem strengen Verhalten variieren.
"minimum_should_match": 1 sagt, dass mindestens eine der should-Anweisungen wahr sein muss.
Diese Anweisung bedeutet, dass jedes Mal, wenn sich in der Ergebnismenge ein Dokument befindet, das has_image: 1 enthält, es um den Faktor 100 erhöht wird. Dies ändert die Reihenfolge der Ergebnisse.
Habt Spaß Jungs :)
quelle
Auf diese Weise können Sie mehrere Bool-Abfragen mit Kibana in einer äußeren Bool-Abfrage verschachteln.
So können Sie eine Abfrage in ES verschachteln
Es gibt mehr Typen in "bool" wie -
Filter
darf nicht
quelle
Ich musste kürzlich auch dieses Problem lösen und nach vielen Versuchen und Irrtümern kam ich auf diese Idee (in PHP, aber direkt auf DSL abgebildet):
Welche Zuordnung zu so etwas in SQL:
Der Schlüssel zu all dem ist die
minimum_should_match
Einstellung. Ohne diesfilter
überschreibt das völlig dasshould
.Hoffe das hilft jemandem!
quelle
In
must
müssen Sie das Abfragebedingungsarray hinzufügen, mit dem Sie arbeiten möchten,AND
und inshould
müssen Sie die Abfragebedingung hinzufügen, mit der Sie arbeiten möchtenOR
.Sie können dies überprüfen: https://github.com/Smile-SA/elasticsuite/issues/972
quelle
Wenn Sie den Standard- oder Lucene-Abfrageparser von Solr verwendet haben, können Sie ihn so gut wie immer in eine Abfragezeichenfolgenabfrage einfügen:
Möglicherweise möchten Sie jedoch eine boolesche Abfrage verwenden , wie die bereits veröffentlichte, oder sogar eine Kombination aus beiden.
quelle