2013-12-20 13 views
6

Ich habe einen Elastic-Suchindex aus einer Mongo-Datenbank erstellt. Die Dokumente in Mongo haben die folgende Struktur:Elastische Suchbereichsdaten

{ 
    "_id" : ObjectId("525facace4b0c1f5e78753ea"), 
    "time" : ISODate("2013-10-17T09:23:56.131Z"), 
    "type" : "A", 
    "url" : "www.google.com", 
    "name" : "peter", 
} 

Der Index wurde erstellt (scheinbar) ohne Probleme. Jetzt versuche ich die elastische Suche zu verwenden, um die Dokumente im Index zwischen zwei Daten abzurufen. Ich habe gelesen, dass ich Bereichsabfragen verwenden, aber ich habe viele Male die Dinge versucht, wie

MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "peter").type(Type.PHRASE).minimumShouldMatch("99%"); 
LocalDateTime toLocal = new LocalDateTime(2013,12,18, 0, 0); 
Date to = toLocal.toDate(); 
LocalDateTime fromLocal = new LocalDateTime(2013,12,17, 0, 0); 
Date from = fromLocal.toDate(); 
RangeQueryBuilder queryDate = QueryBuilders.rangeQuery("time").to(to).from(from); 
FilterBuilder filterDate = FilterBuilders.queryFilter(queryDate);  

srb = esH.client.prepareSearch("my_index"); 
srb.setQuery(queryBuilder); 
srb.setFilter(filterDate); 
sr = srb.execute().actionGet(); 

und ich bekomme 0 Treffer obwohl es sollte viele Ergebnisse sein. Ich habe versucht, Zeichenfolgen anstelle von Daten einzugeben, aber dieselben Ergebnisse.

Wenn ich eine grundlegende Abfrage ohne Filter zuführen:

MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "peter").type(Type.PHRASE).minimumShouldMatch("99%"); 

SearchRequestBuilder srb = esH.client.prepareSearch("my_index"); 
rb.setQuery(queryBuilder); 
SearchResponse sr = srb.execute().actionGet(); 

ich Hits mit, dass wie folgt aussehen:

{ 
"_index" : "my_index", 
"_type" : "type", 
"_id" : "5280d3c2e4b05e95aa703e34", 
"_score" : 1.375688, "_source" : {"type":["A"],"time":["Mon Nov 11 13:55:30 CET 2013"],"name":["peter"]} 
} 

Wo das Feld time nicht das Format ISODate("2013-10-17T09:23:56.131Z") mehr hat.

Zusammenfassend, was wäre der Java-Code (und Typen) für die Abfrage zwischen zwei Daten (und Zeiten), unter Berücksichtigung des Formats?

+0

Könnten Sie die aktuelle JSON-Abfrage hinzufügen, dass der Builder Erzeugung? Es ist wirklich schwer zu sagen, was passiert, ohne zu sehen, was ES tatsächlich sieht. – drewish

Antwort

5

Sie sind wahrscheinlich das falsche Feld Name auf den Bereich der Abfrage in dieser Zeile vorbei:

RangeQueryBuilder queryDate = QueryBuilders.rangeQuery("time").to(to).from(from);

Es sollte wohl sein @timestamp (oder dem Feld Sie verwenden speichern Sie Ihre Zeitstempel) statt time . Außerdem scheint in Elasticsearch kein time Feld für das Beispieldokument vorhanden zu sein. Dies deutet auch auf das Problem hin, dass das Feld time nicht korrekt von Mongo nach Elasticsearch konvertiert wurde.

+0

Das funktionierte wie ein Zauber für mich – pandaadb

4

Können Sie versuchen

FilterBuilders.rangeFilter("@timestamp").from("from time").to("toTime") 
+0

Ist das veraltet oder so? Weil es nicht funktioniert. –