2016-07-20 2 views
0

Я новичок в ElasticSearch, поэтому, пожалуйста, пройдите ко мне. Я посмотрел на elastic.co и googled много, чтобы выяснить правильный фильтр Java и запрос, чтобы применить, чтобы иметь возможность вытаскивать только документы, срок действия которых истекает в течение следующих x дней, где x - это значение, переданное пользователем приложение, а также набор ttl для каждого из документов в Elastic.ElasticSearch Java Запрос на получение документов, срок действия которых истекает в следующие x дней

Я пробовал различные фильтры, такие как rangeFilter, boolFilter на FilterBuilders, которые проходят в просьбе Elastic как:

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-код для поиска выглядит следующим образом:

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(); 

где фильтр, который проходит, составляет:

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

Другие параметры, такие как запрос, индекс , тип передается в код. В настоящее время только индекс и тип передаются в код, а не запрос (null)

Вышеприведенный запрос к Elastic дает нулевые удары, поэтому, очевидно, что-то не так. У меня есть несколько документов, срок действия которых истекает в течение 15 дней. Любая помощь будет принята с благодарностью.

Благодаря

+0

Какую версию ES вы используете? – Andre85

+0

Использование версии 0.90.10 – sanjuk21

ответ

0

При использовании _ttl поля в запросе диапазона, вам нужно указать в/которые представляют значение миллисекунды, а не дни.

Так что в вашем случае вы должны сделать что-то вроде этого, и он будет работать:

// 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

Спасибо за предложение, но я все равно вернусь 0 ударов. – sanjuk21

+0

Можете ли вы поделиться исходным исходным кодом, который вы генерируете, и, в конечном итоге, ваш последний код Java? – Val

+0

Было бы лучше, если бы вы обновили свой вопрос, это было бы более разборчиво. – Val

Смежные вопросы