一般情况下,把
java.util.Date
存储到
Elasticsearch
,然后从
Elasticsearch
中再取出来的时候,要想保证它是个
Date
,
需要做额外任何转换。
本文介绍如何在ElasticSearch中进行时间范围查询操作。
public class EsMulConditionQuery {
private static String index = "test_index5";
private static String type = "test_type5";
public static void main(String[] args) throws IOException, ParseException {
Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name", "elasticsearch")
.put("client.transport.sniff", true)// 开启ES嗅探功能,确保集群连上多个节点
.build();
// 创建客户端
TransportClient transportClient = new TransportClient(settings);
// 添加es的节点信息,可以添加1个或多个
TransportAddress transportAddress = new InetSocketTransportAddress("218.193.126.32", 9300);
transportClient.addTransportAddresses(transportAddress);
// 连接到的节点
ImmutableList<DiscoveryNode> connectedNodes = transportClient.connectedNodes();
for (DiscoveryNode discoveryNode : connectedNodes) {
System.out.println(discoveryNode.getHostAddress());
/**进行Mapping设置,这一步设置了索引字段的存储格式,极其重要,否则后面的查询会查出0条记录*/
XContentBuilder mapping = XContentFactory.jsonBuilder()
.startObject()
.startObject("properties")
.startObject("PolicyCode")
.field("type", "string")
.field("index","not_analyzed")
.endObject()
.startObject("ServiceId")
.field("type", "string")
.field("index", "not_analyzed")
.endObject()
.startObject("CreateTime")
.field("type", "date")
.field("format","yyyy-MM-dd HH:mm:ss")
.endObject()
.endObject()
.endObject();
CreateIndexRequestBuilder prepareCreate =transportClient.admin().indices().prepareCreate(index);
prepareCreate.setSettings(settings).addMapping(type, mapping).execute().actionGet();
/**向索引库中插入数据*/
for (int i = 0; i < 10; i++) {
HashMap<String, Object> hashMap = new HashMap<String, Object>();
if (i % 2 == 0) {
hashMap.put("PolicyCode", "5674504720");
hashMap.put("ServiceId", "SE2");
hashMap.put("CreateTime", "2016-08-21 00:00:01");
} else {
hashMap.put("PolicyCode", "666666666");
hashMap.put("ServiceId", "SE3");
hashMap.put("CreateTime", "2016-10-21 00:00:01");
IndexResponse indexResponse = transportClient.prepareIndex(index,
type).setSource(hashMap).get();
* rangeQuery时间范围查询
* 以下三种查询方式的效果一样
//多条件查询
SearchResponse searchResponse = transportClient.prepareSearch(index)
.setTypes(type)
.setQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.matchPhraseQuery("PolicyCode", "5674504720"))
.must(QueryBuilders.rangeQuery("CreateTime").from("2016-8-21 00:00:01")
.to("2017-7-21 00:00:03")))
.get();
// SearchResponse searchResponse = transportClient.prepareSearch(index)
// .setTypes(type)
// .setQuery(QueryBuilders.rangeQuery("CreateTime").from("2016-07-21 11:00:00").to("2017-07-21 11:00:00"))
// .get();
// SearchResponse searchResponse = transportClient.prepareSearch(index)
// .setTypes(type)
// .setQuery(QueryBuilders.rangeQuery("CreateTime").gt("2016-07-21 11:00:00").lt("2017-07-21 11:00:00"))
// .get();
* rangeFilter时间范围查询
* 以下两种查询方式的效果一样
// SearchResponse searchResponse = transportClient.prepareSearch(index)
// .setTypes(type)
// .setPostFilter(FilterBuilders.rangeFilter("age").gt(2).lt(5)).get();
// .setPostFilter(FilterBuilders.rangeFilter("age").from(2).to(5)).get();
// 获取查询结果
SearchHits hits = searchResponse.getHits();
long totalHits = hits.getTotalHits();
System.out.println("总数目=" + totalHits);
SearchHit[] hits2 = hits.getHits();
for (SearchHit searchHit : hits2) {
System.out.println(searchHit.getSourceAsString());
ES索引库中的原始数据:
查询结果:
一般情况下,把java.util.Date存储到 Elasticsearch ,然后从 Elasticsearch 中再取出来的时候,要想保证它是个Date ,需要做额外任何转换。本文介绍如何在ElasticSearch中进行时间范围查询操作。public class EsMulConditionQuery { private static String index = "test_in
from datetime import datetime
from elasticsearch import Elasticsearch
from elasticsearch import helpers
es = Elasticsearch()
actions = []
f=open('index.txt')
for line in f:
line = line.strip().split(' ')
java时间范围查询public class EsRange{
public void RangeSearch(TransportClient client){
//时间范围的设定
RangeQueryBuilder rangequerybuilder = QueryBuilders
.rangeQuery("input
在使用restHighLevelClient进行日期时间查询的时候,发现返回结果不对,好像把查询条件前8小时的数据查出来了。原来是时区不对。因为es默认时区是UTC,所以在查询的时间要把日期时间类型转成UTC格式进行查询。
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
boolQueryBuilder.must(QueryBuilders.rangeQuery("commentTime").gte(f
ElasticSearch6.X时间范围查询无效bug
1.es6.8.1版本时间范围查询,原始写法如下:
GET /oms_historyalarm.historyalarm_recent/historyalarm_recent/_search
"query":{
"range":{
"fault_start_time":{
"from":"2019-10-28 00:00:00",
//闭区间查询
QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").from(${fieldValue1}).to(${fieldValue2});
//开区间查询
QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").from(${fieldValue1}, false).to(${fieldValue2}, false);
Quer.
> = 5.0,<6 xss=removed xss=removed> [
CrCms\ElasticSearch\LaravelServiceProvider::class,
如果您想在配置文件中进行配置更改,则可以使用以下Aritsan命令将其发布:
php artisan vendor:publish
### 回答1:
Elasticsearch 时间段查询是指在 Elasticsearch 中根据时间范围进行查询。可以使用 Elasticsearch 的时间范围查询功能来查询特定时间段内的文档。时间段查询可以用于各种应用程序,例如日志分析、监控和报告等。在 Elasticsearch 中,可以使用时间范围查询来过滤文档,以便只返回在指定时间范围内创建或修改的文档。时间段查询可以使用时间戳、日期和时间格式等不同的时间格式。
### 回答2:
Elasticsearch 是一款基于的搜索引擎,支持爆炸式增长的数据存储,可以快速地从海量的数据中获取需要的信息。一个常见的需求是通过时间段进行查询,这在许多应用场景中都是必须的。
在 Elasticsearch 中,时间段查询可以通过两种方式进行:使用 range 查询和 date range 查询。
使用 range 查询
range 查询是一种灵活的查询方式,可以用来针对数字、字符串、日期等类型的字段进行查询。在时间段查询中,可以使用 range 查询来查询所需时间段的数据。下面是一个简单的时间段查询示例:
GET /my_index/_search
"query": {
"range": {
"timestamp": {
"gte": "2020-08-01",
"lte": "2020-08-31"
在这个示例中,我们查询了索引 my_index 中所有时间戳在 2020 年 8 月 1 日至 2020 年 8 月 31 日之间的数据。
使用 date range 查询
Elasticsearch 也提供了一种更方便的方式来进行时间段查询,即使用 date range 查询。下面是一个 date range 查询的示例:
GET /my_index/_search
"query": {
"range": {
"date": {
"gte": "2020-08-01T00:00:00.000Z",
"lte": "2020-08-31T23:59:59.999Z"
在这个示例中,我们查询了索引 my_index 中所有日期在 2020 年 8 月 1 日至 2020 年 8 月 31 日之间的数据。注意,这里的日期格式是 ISO 8601 标准的日期时间格式,包括时区信息。
无论是使用 range 查询还是 date range 查询,都可以轻松地进行时间段查询。如果您想获得更多的查询选项,可以查看 Elasticsearch 的官方文档,里面提供了丰富的查询语法和选项。
### 回答3:
Elasticsearch是一款强大的开源搜索引擎,它可以提供快速、高效的全文搜索功能。其中,时间段查询是Elasticsearch非常重要的一个功能,可以用于按照时间段索引和检索数据。下面我们来了解一下Elasticsearch时间段查询的相关知识。
时间段查询是一种查询方式,允许我们搜索一定时间范围内的数据。在Elasticsearch中,时间段查询可以使用Range Query来实现。具体来说,Range Query是一种查询类型,它用于查询一个索引中与指定范围内的数据匹配的所有文档。在时间段查询中,我们可以使用Range Query来指定搜索的时间范围。
在Elasticsearch中,时间段查询可以使用两种方式来实现。一种是使用Range Query,另一种是使用Date Range Aggregation。其中,Date Range Aggregation可以用于按照时间段聚合数据。
下面,我们来介绍一下如何使用Range Query实现时间段查询。在使用Range Query时,我们需要指定一个时间字段,并且指定查询的时间范围。例如,我们可以使用以下代码实现按照时间段查询:
GET /_search
"query": {
"range" : {
"timestamp" : {
"gte" : "now-1d/d",
"lt" : "now/d"
在上述代码中,我们使用了timestamp字段作为时间字段,然后使用now-1d/d和now/d来指定时间范围。其中,now-1d/d表示以当前时间减去一天为开始时间,now/d表示到当前时间为止的时间段。因此,上述查询可以搜索昨天到今天的数据。
另外,在实际使用中,我们还可以使用其他时间单位来指定时间段,例如now-1h/h表示搜索一小时内的数据。
总之,Elasticsearch时间段查询功能非常强大,可以方便地筛选出符合特定时间范围的数据。如果您正在使用Elasticsearch进行全文搜索,那么时间段查询将会是您的不可或缺的功能。