2016-06-06 6 views
0

Ich verwende Rails 4.1.4 mit searchkick (1.3.0), so kann ich elastische Suche verwenden.Wie können Datumsbereiche mit ElasticSearch und Searchkick gesucht werden?

Ich habe User Modell

class User 
    searchkick 
    def search_data 
    { 
    name: username, 
    email: email, 
    created_at: created_at.strftime("%d-%m-%Y") 
    } 
    end 
end 

created_at in dd-MM-yyyy Format. Wie kann ich nach einem Datumsbereich suchen, beispielsweise nach einem Datum von 01-01-2014 bis 01-01-2015?

Ich müde etwas wie User.search('*', where: {created_at: {gte:'01-01-2014', lte: '01-01-2015' } }) ohne die richtigen Ergebnisse zu erhalten.

Irgendwelche Hilfe?

Antwort

1

Ich bin nicht vertraut mit Searchkick, aber wenn man die elasticsearch gem verwenden, können Sie einfach eine Suchanfrage wie

query = { 
    query: { 
    bool: { 
     must: [ 
     { 
      term: { 
      username: "Kevin" 
      } 
     }, 
     { 
      term: { 
      email: "[email protected]" 
      } 
     }, 
     { 
      range: { 
      created_at: { 
       lte: "2016-06-06", 
       gte: "2016-06-06", 
       format: "yyyy-MM-dd" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

Die Suchanfrage aussehen wird Elasticsearch machen:

client = Elasticsearch::Client.new 
client.search( 
    index: index_name, 
    body: { 
    query: query 
    } 
) 

Hoffnung das hilft!

+0

Dank für Ihre Hilfe. Also für den Bereich muss ich nicht das Feld 'created_at' angeben? –

+0

Wenn ich Begriff mit searchkick verwende, bekomme ich den folgenden Fehler: "Unbekannt wo operator:: range" –

+0

Ich habe gerade meine Abfrage aktualisiert, sorry, dass ich das Feld 'created_at' verpasst habe, Sie sind richtig. Über Searchkick schlage ich vor, dass Sie die Quelle der Abfrageklasse https://github.com/ankane/searchkick/blob/master/lib/searchkick/query.rb überprüfen. Ich fand es ein wenig verwirrend für mich, haha. – duykhoa

2
class User 
    searchkick 
    def search_data 
    { 
    name: username, 
    email: email, 
    created_at: created_at.to_time 
    } 
    end 
end 

Statt

created_at: created_at.strftime("%d-%m-%Y")

Versuchen

created_at: created_at.to_time

0

Formular, um ein richtiges Datetime-Objekt und den Code sollte funktionieren verwendet nur

.to_datetime 
Verwandte Themen