Ich habe zwei Abfragen in ES. Beide haben unterschiedliche Bearbeitungszeiten für denselben Satz von Dokumenten. Beide machen konzeptionell dasselbe. Ich habe wenige ZweifelGefilterte Bool gegen Bool Abfrage: Elasticsearch
1- Was ist der Unterschied zwischen diesen beiden? 2- Welches ist besser zu verwenden? 3- Wenn beide gleich sind, warum funktionieren sie anders?
1. Filtered bool
{
"from": 0,
"size": 5,
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"term": {
"called_party_address_number": "1987112602"
}
},
{
"term": {
"original_sender_address_number": "6870340319"
}
},
{
"range": {
"x_event_timestamp": {
"gte": "2016-07-01T00:00:00.000Z",
"lte": "2016-07-30T00:00:00.000Z"
}
}
}
]
}
}
}
},
"sort": [
{
"x_event_timestamp": {
"order": "desc",
"ignore_unmapped": true
}
}
]
}
2. Simple Bool
{
"query": {
"bool": {
"must": [
{
"term": {
"called_party_address_number": "1277478699"
}
},
{
"term": {
"original_sender_address_number": "8020564722"
}
},
{
"term": {
"cause_code": "573"
}
},
{
"range": {
"x_event_timestamp": {
"gt": "2016-07-13T13:51:03.749Z",
"lt": "2016-07-16T13:51:03.749Z"
}
}
}
]
}
},
"from": 0,
"size": 10,
"sort": [
{
"x_event_timestamp": {
"order": "desc",
"ignore_unmapped": true
}
}
]
}
Mapping:
{
"ccp": {
"mappings": {
"type1": {
"properties": {
"original_sender_address_number": {
"type": "string"
},
"called_party_address_number": {
"type": "string"
},
"cause_code": {
"type": "string"
},
"x_event_timestamp": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
},
.
.
.
}
}
}
}
}
Update 1:
Ich versuchte Bool/muss abfragen und Bool/Filter-Abfrage auf denselben Datensatz, aber ich fand das seltsame Verhalten
1- bool/muss Abfrage ist in der Lage, die gewünschten zu suchen dokumentieren
{
"query": {
"bool": {
"must": [
{
"term": {
"called_party_address_number": "8701662243"
}
},
{
"term": {
"cause_code": "401"
}
}
]
}
}
}
2- Während Bool/Filter nicht in der Lage ist, das Dokument zu suchen. Wenn ich die zweite Feldbedingung entfernen sucht er denselben Datensatz mit field2 Wert als 401.
{
"query": {
"bool": {
"filter": [
{
"term": {
"called_party_address_number": "8701662243"
}
},
{
"term": {
"cause_code": "401"
}
}
]
}
}
}
Update2:
Gefunden wird eine Lösung von Scoring-Phase mit Bool unterdrücken/Abfrage muss es innerhalb Einwickeln "Konstante_Score".
{
"query": {
"constant_score": {
"filter": {
"bool": {
"must": [
{
"term": {
"called_party_address_number": "1235235757"
}
},
{
"term": {
"cause_code": "304"
}
}
]
}
}
}
}
}
Nehmen wir versuchen, haben "called_party_address_number" zu entsprechen: "1235235757" und "cause_code": "304".
Interessanterweise ist die zweite von Kopf plugin.Thanks erzeugt wird . – Mudit
Beide sind gültig, aber die erste mit 'must' wird im Abfragekontext ausgeführt (mit Score-Berechnung, daher langsamer), während die zweite mit' filter' eine Art Optimierung ist, wenn Sie kein Scoring benötigen. – Val
Ich brauche dafür keine Punkte. Gehen Sie für einen von Ihnen vorgeschlagenen. Vielen Dank für schnelle Hilfe. – Mudit