2017-01-27 1 views
1

ich folgende Filter mit Elasticsearch (Java-Client) haben wollen:Elasticsearch (2.2) Java-Filter zwischen startdate und endDate falls vorhanden

Wenn startdate existiert und senken dann jetzt

Wenn endDate und mehr existiert dann jetzt

ich habe bereits folgende, aber es zeigt nicht die einmal die keine oder endDate haben startdate:

 //Start date end date 

     BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); 
     queryBuilder.filter(QueryBuilders.rangeQuery("startDate").lte("now")); 
     queryBuilder.should(QueryBuilders.existsQuery("startDate")); 
     queryBuilder.filter(QueryBuilders.rangeQuery("endDate").gte("now")); 
     queryBuilder.should(QueryBuilders.existsQuery("endDate")); 

     boolQueryBuilder.filter(queryBuilder); 

die Abfrage in mysql sah wie folgt aus:

SELECT * FROM customer_job WHERE (start_date <= CURDATE() OR start_date IS NULL) AND (end_date>=CURDATE() OR end_date IS NULL); 

So, wie das zu tun?


Ich habe versucht, aus den Antworten folgenden es gibt aber noch nicht diejenigen zeigen, die keine startdate oder endDate haben:

BoolQueryBuilder startDateQuery = new BoolQueryBuilder() 
       .should(QueryBuilders.existsQuery("startDate")) 
       .should(QueryBuilders.rangeQuery("startDate").lte("now")) 
       .minimumNumberShouldMatch(1); 
     BoolQueryBuilder endDateQuery = new BoolQueryBuilder() 
       .should(QueryBuilders.existsQuery("endDate")) 
       .should(QueryBuilders.rangeQuery("endDate").gte("now")) 
       .minimumNumberShouldMatch(1); 

     boolQueryBuilder.filter(startDateQuery).filter(endDateQuery); 

Antwort

1

Sie benötigen eine Abfrage wie folgt aus:

BoolQueryBuilder startDateQuery = new BoolQueryBuilder() 
    .should(QueryBuilders.missingQuery("startDate")) 
    .should(QueryBuilders.rangeQuery("startDate").lte("now")) 
    .minimumShouldMatch(1); 
BoolQueryBuilder endDateQuery = new BoolQueryBuilder() 
    .should(QueryBuilders.missingQuery("endDate")) 
    .should(QueryBuilders.rangeQuery("endDate").gte("now")) 
    .minimumShouldMatch(1); 
BoolQueryBuilder queryBuilder = new BoolQueryBuilder() 
    .filter(startDateQuery) 
    .filter(endDateQuery); 
+0

Vielen Dank für Ihre Antwort :) Es sah vielversprechend aus, aber es zeigt immernoch nicht die, die kein Datum haben - siehe Bearbeiten :) –

+0

Doh, du musst 'existsQuery' durch' missingQuery' ersetzen, mein bad – Val

+0

Beeindruckend :) Es funktioniert -> Bitte se korrigieren Sie Ihre Antwort und ich werde akzeptieren! Danke vielmals!!! –

Verwandte Themen