相关文章推荐

一般情况下,把 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进行全文搜索,那么时间查询将会是您的不可或缺的功能。
 
推荐文章