2016-07-20 4 views
0

Ich bin neu in ElasticSearch, also bitte gehen Sie einfach auf mich. Ich habe auf elastic.co geschaut und viel gegoogelt, um den richtigen Java-Filter und die zutreffende Abfrage zu finden, um nur die Dokumente abzurufen, die in den nächsten x Tagen ablaufen werden, wobei x ein Wert ist, der vom Benutzer übergeben wurde die Anwendung und ist auch die TTL auf jedem der Dokumente in Elastic festgelegt.ElasticSearch Java Anfrage zum Abrufen von Dokumenten in den nächsten x Tagen

Ich habe verschiedene Filter wie rangeFilter, boolFilter auf den FilterBuilders versucht, die in der Anfrage an Elastic passieren wie:

Raw Source: { 
"from" : 0, 
"size" : 20, "filter" : { 
"bool" : { 
    "should" : { 
    "range" : { 
     "_ttl" : { 
     "from" : 2000, 
     "to" : 2160000000, 
     "include_lower" : false, 
     "include_upper" : true 
     } 
    } 
    } 
} 
}, 
    "explain" : false, 
    "fields" : [ "_ttl", "_source" ], 
    "sort" : [ { 
    "created" : { 
     "order" : "desc" 
    } 
    } ] 
} 

Java-Code für die Suche ist wie folgt:

SearchRequestBuilder srb = client.prepareSearch(index).setTypes(type).addFields("_ttl", "_source") 
      .setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setExplain(false); 

     if (query != null) srb.setQuery(query); 
     if (filter != null) srb.setPostFilter(filter); 

     LOG.debug("Raw Source: {}\n", srb.toString()); 

     // Fetch the Document response from the index 
     SearchResponse response = srb.execute().actionGet(); 

wo Filter, der übergeben wird, ist:

(FilterBuilders.boolFilter().should(FilterBuilders.rangeFilter(_ttl).gt(2000).lte(2160000000))); 

Andere Parameter wie Abfrage, Index , Typ wird dem Code übergeben. Derzeit werden nur Index und Typ an den Code übergeben und nicht abgefragt (null)

Die obige Abfrage zu Elastic ergibt null Treffer, also ist offensichtlich etwas nicht in Ordnung. Ich habe mehrere Dokumente, die innerhalb von 15 Tagen ablaufen. Jede Hilfe würde sehr geschätzt werden.

Dank

+0

Welche Version von ES verwenden Sie? – Andre85

+0

Verwendung der Version 0.90.10 – sanjuk21

Antwort

0

Wenn in einem Bereich Abfrage des _ttl Feld verwenden, müssen Sie von/bis die Millisekunde Wert darstellen spezifizieren und nicht Tage.

in Ihrem Fall also sollten Sie etwas tun und es wird funktionieren:

// from now 
long from = System.currentTimeMillis(); 
// to 15 days from now 
long to = from + (15 * (1000 * 60 * 60 * 24)); 

FilterBuilders.boolFilter() 
    .should(FilterBuilders.rangeFilter("_ttl") 
     .gt(from) 
     .lt(to)); 
+0

Danke für den Vorschlag, aber ich bekomme immer noch 0 Treffer. – sanjuk21

+0

Können Sie die rohe Quelle, die Sie generieren, und eventuell auch Ihren neuesten Java-Code teilen? – Val

+0

Es wäre besser, wenn Sie Ihre Frage mit diesen aktualisieren, wäre es besser lesbar. – Val

Verwandte Themen