2016-05-04 18 views
1

Ich benutze elastische Suche .Net NEST Client, den ich noch nie zuvor verwendet habe. Was ich versuche zu tun, ist Ergebnis nach Datumsbereich vor dem Scoring zu filtern.Elasticsearch NEST Filter nach Datumsbereich

Ich benutze Objektinitialiser-Syntax, weil es am besten zu mir passt.

ich erreicht habe, was ich mit will:

 var filter = new FilteredQuery(); 

     var queryForm = new TermQuery(); 
     queryForm.Field = "id"; 
     queryForm.Value = filterModel.Id; 

     filter.Query &= queryForm; 

     var rangeQuery = new DateRangeQuery(); 
     rangeQuery.Field = "datetime"; 
     rangeQuery.GreaterThanOrEqualTo = filterModel.DateBegin.Value.AddDays(-1); 
     rangeQuery.LessThanOrEqualTo = filterModel.DateEnd.Value.AddDays(1); 
     filter.Filter = rangeQuery; 

     // Use boolean query 
     searchRequest.Query = new BoolQuery() && filter; 

Das gibt mir JSON verlangen, wie ich erwartet.

{ 
    "from": 0, 
    "size": 0, 
    "query": { 
    "filtered": { 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "id": { 
        "value": "XXXX" 
       } 
       } 
      } 
      ] 
     } 
     }, 
     "filter": { 
     "range": { 
      "datetime": { 
      "gte": "2015-12-31T00:00:00", 
      "lte": "2016-05-05T00:00:00" 
      } 
     } 
     } 
    } 
    } 
} 

Aber Dokumentation über filtered query sagt: „Veraltete in 2.0.0-beta 1 Verwenden die bool-Abfrage stattdessen mit einer must-Klausel für die Abfrage und einer Filterklausel für den Filter ".

Da dies die einzige Möglichkeit ist, Filter zu finden, gibt es eine bessere Möglichkeit, dies mit NEST Object Initializersyntax zu tun? Wie kann ich "Filterklausel für den Filter" verwenden oder muss ich Bereichsabfrage und Filter vergessen?

Danke!

Antwort

5

Es gibt eine blog post, die die Änderungen in NEST 2.0 mit ES 2.0 erläutert.

Um Ihre term und range Filter auf eine bool/filter Abfrage mit der Objektinitialisierer Syntax hinzufügen, können Sie es mit dem neuen + speziellen Konstrukt tun können, was die term Abfrage verursacht innerhalb einer bool Abfrage Filterklausel gewickelt werden:

var queryForm = +new TermQuery(); 
    queryForm.Field = "id"; 
    queryForm.Value = filterModel.Id; 

    var rangeQuery = +new DateRangeQuery(); 
    rangeQuery.Field = "datetime"; 
    rangeQuery.GreaterThanOrEqualTo = filterModel.DateBegin.Value.AddDays(-1); 
    rangeQuery.LessThanOrEqualTo = filterModel.DateEnd.Value.AddDays(1); 

    searchRequest.Query = queryForm && rangeQuery 

weitere Details here

+0

++ zu dem Verwendungsbeispiel Verknüpfung :) –

Verwandte Themen