2017-03-29 1 views
0

Ich versuche, die Leistung einer elasticsearch Abfrage zu verbessern. Das Ziel der Abfrage ist nur die Dokumente abrufen, die die Abfrage entsprechen, so dass die Punktzahl keine Rolle spielt, ist auch wichtig zu erwähnen, wir haben einen Index pro Tag, so die Quer. So weit ich weiß für diese Fälle ist besser, Filter zu verwenden, Vermeidung von Scoring zu berechnen, aber auch ich nur rot, dass es gibt/gibt eine Alternative mit Finter innerhalb Abfrage Abfrage alle Dokument Punktzahl 1, so die erste Abfrage, die ich machte, war die folgende :optimieren elasticsearch Abfrage mit Filter, Abfrage oder Mischung von beiden

{ 
"filter": { 
    "bool": { 
    "must": [{ 
    "match": { 
     "from": "[email protected]" 
    } 
    }, { 
    "range": { 
     "receivedDate": { 
     "gte": "date1", 
     "lte": "date2" 
     } 
    } 
    } 
    ] 
    } 
} 
} 

dann machte ich meinen ersten Test und ich „Filter“ für „Abfrage“ und die meiste Zeit ich, das ist meine erste Frage „Filter“ bessere Zeiten ändern „Abfrage“ und dann mit bekommen, warum? Was habe ich an meiner Abfrage falsch gemacht, um Filter langsamer als eine Abfrage zu haben?

Nachdem als ich das Lesen immer wieder versuchen, es zu verbessern, und ich habe dies:

{ 
    "query": { 
     "bool": { 
      "must": { 
       "match_all": {} 
      }, 
      "filter": { 
       "bool": { 
        "must": [{ 
          "match": { 
           "from": "[email protected]" 
          } 
         }, { 
          "range": { 
           "receivedDate": { 
            "gte": "date1", 
            "lte": "date2" 
           } 
          } 
         } 
        ] 
       } 
      } 
     } 
    } 
} 

Mit letzterem habe ich den Eindruck, ein wenig verbessert. Also nach Ihrer Erfahrung können Sie mir sagen, welche besser (zumindest in der Theorie), um ein schnelleres Ergebnis zu haben, auch die Chance, dass die Verwendung einer dieser Abfragen die Ergebnisse cachen die Ergebnisse verbessern die durchgeführten Abfragen. Gibt es eine bessere Möglichkeit, diese Abfrage zu machen? Vielen Dank im Voraus für Ihre Hilfe. Ich habe vergessen zu erwähnen, ich verwende Elasticsearch v2.3

+0

Was ist die Abbildung des 'from' Feldes? – Val

+0

Ich habe vergessen zu erwähnen, dass ich auch Change Match Sentece für Ausdruck testen, weil das Feld nicht analysiert wird und soweit ich weiß, würde dies es verbessern. Also vom Feld ist String not_analyzed und das receivedDate ist das Datum – Joseratts

Antwort

1

In Ihrer ersten Abfrage verwendeten Sie nur eine post_filter. Ihre zweite Abfrage ist der Weg zu gehen, aber es kann auf diese (keine Notwendigkeit zu wickeln bool/filter innen bool/must) optimiert werden:

{ 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "range": { 
      "receivedDate": { 
       "gte": "date1", 
       "lte": "date2" 
      } 
      } 
     }, 
     { 
      "term": { 
      "from": "[email protected]" 
      } 
     } 
     ] 
    } 
    } 
} 
+0

Irgendein Glück damit? – Val