elasticsearch原生支持date类型。这里简单记录下使用的方法。

使用date类型可以用如下两种方式:

  1. 使用毫秒的时间戳,直接将毫秒值传入即可。

  2. 传入格式化的字符串,默认是ISO 8601标准,例如2015-02-27T00:07Z(零时区)、2015-02-27T08:07+08:00(东八区),这两个时间实际是同一个,只是时区不同。另外还可以自定义时间格式,参见es的文档。但个人不建议使用自定义格式,设置不当容易遇到时区问题。在php中获取ISO 8601标准的时间很简单,date('c',time())即可。

elasticsearch默认会自动识别date类型,如果想关闭该功能,修改mapping的设置'date_detection' => false即可 。

贴下我的代码:

package com.osp.log.service.impl;

import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map; import javax.ws.rs.core.Response; import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.avg.AvgAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.avg.InternalAvg;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.stereotype.Service; import com.osp.common.json.JsonUtil;
import com.osp.log.config.ESConfig;
import com.osp.log.model.SearchModel;
import com.osp.log.model.SearchResultBean;
import com.osp.log.model.TomcatModel;
import com.osp.log.service.SearchService;
import com.osp.log.util.ESUtil;
import com.osp.log.util.TimeUtils; /**
* 关键字搜索
*
* @author zhangmingcheng 2017-09-26
*/
@Service
public class SearchServiceImpl implements SearchService { public static final String INDEX_NAME = "logstash-apacheaccesslog*"; // 索引名称
public static final String INDEX_TYPE = "logs"; // 索引类型 /**
* 关键字搜索
*
* @param q
* 关键词
* @param page
* 页码
* @param pageSize
* 页数大小
* @param ip
* 请求客户端ip
* @param city
* 请求客户端所在城市
* @return
*/
@Override
public SearchResultBean getSearchesult(String keyword, String ip, String city, Integer page, Integer pagesize) {
TransportClient client = ESUtil.getClient();
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
if (keyword.isEmpty()) {
boolQueryBuilder.must(QueryBuilders.matchAllQuery());
} else {
boolQueryBuilder.must(QueryBuilders.multiMatchQuery(keyword, "request", "verb", "clientip", "message",
"path", "response", "host", "timestamp"));
}
/**
* 高亮设置
*/
HighlightBuilder hiBuilder = new HighlightBuilder();
hiBuilder.preTags("<span class=\'pointKey\'>");
hiBuilder.postTags("</span>");
hiBuilder.field("request", 50);
hiBuilder.field("message", 30);
/**
* 开始搜索
*/
SearchResponse response = client.prepareSearch(SearchServiceImpl.INDEX_NAME)
.setTypes(SearchServiceImpl.INDEX_TYPE).setSearchType(SearchType.DEFAULT).setQuery(boolQueryBuilder)
.setFrom(pagesize * (page - 1)).setSize(pagesize).highlighter(hiBuilder).setExplain(true) // 设置是否按查询匹配度排序
.get();
SearchHits myhits = response.getHits();
LinkedList<TomcatModel> newsList = new LinkedList<>();
for (SearchHit hit : myhits) {
Map<String, Object> map = hit.getSource();
TomcatModel tomcatModel = new TomcatModel();
String request = this.getHighlightFieldString(hit, "request");
String message = this.getHighlightFieldString(hit, "message");
if (request.isEmpty()) {
tomcatModel.setRequest((String) map.get("request"));
} else {
tomcatModel.setRequest(request);
}
if (message.isEmpty()) {
tomcatModel.setMessage((String) map.get("message"));
} else {
tomcatModel.setMessage(message);
}
tomcatModel.setPath((String) map.get("path"));
tomcatModel.setClientip((String) map.get("clientip"));
tomcatModel.setResponse((String) map.get("response"));
tomcatModel.setType((String) map.get("verb"));
tomcatModel.setTimestamp((String) map.get("timestamp"));
newsList.add(tomcatModel);
}
/**
* 记录本次客户端查询:翻页不存储
*/
String usetime = response.getTook().toString();
if (page == 1) {
String json = JsonUtil.beanToJson(new SearchModel(keyword, TimeUtils.getCurrentTime(), ip, city,
Integer.parseInt(usetime.substring(0, usetime.length() - 2)), System.currentTimeMillis()));
client.prepareIndex(ESConfig.SEARCHINDEX, ESConfig.SEARCHTYPE).setSource(json, XContentType.JSON).get();
}
/**
* 开始存储结果
*/
SearchResultBean searchResult = new SearchResultBean();
searchResult.setPage(page);
searchResult.setPagesize(pagesize);
searchResult.setTotal(myhits.getTotalHits());
searchResult.setUsetime(usetime);
searchResult.setNewsList(newsList);
return searchResult;
} /**
* 获取搜索统计数据
*/
@Override
public Response getcount() {
HashMap<String, Object> RealReult = new HashMap<>();
TransportClient client = getClient();
TermsAggregationBuilder agg_clientip = AggregationBuilders.terms("cilentip_count").field("clientip");
AvgAggregationBuilder avg_usetime = AggregationBuilders.avg("avg_usetime").field("usetime");
TermsAggregationBuilder agg_message = AggregationBuilders.terms("agg_message").field("message");
SearchResponse response = client.prepareSearch(ESConfig.SEARCHINDEX).setTypes(ESConfig.SEARCHTYPE)
.addAggregation(agg_clientip).addAggregation(avg_usetime).addAggregation(agg_message)
.setQuery(QueryBuilders.matchAllQuery()).execute().actionGet();
/**
* 搜索次数
*/
RealReult.put("total", response.getHits().getTotalHits());
/**
* 统计访问人数
*/
Terms terms = response.getAggregations().get("cilentip_count");
List<Bucket> buckets = terms.getBuckets();
RealReult.put("people", buckets.size());
/**
* 统计平均搜索用时
*/
InternalAvg avg = response.getAggregations().get("avg_usetime");
DecimalFormat df = new DecimalFormat("#.00");
RealReult.put("avgUsetime", df.format(avg.getValue()).trim() + "ms");
/**
* 统计最多搜索的10个词(聚合默认返回10个值)
*/
Terms messageTerms = response.getAggregations().get("agg_message");
List<Bucket> messageBuckets = messageTerms.getBuckets();
LinkedList<TopWord> result = new LinkedList<TopWord>();
for (Bucket bucket : messageBuckets) {
TopWord topWord = new TopWord();
topWord.set_id((String) bucket.getKey());
topWord.setCount((int) bucket.getDocCount());
result.add(topWord);
}
RealReult.put("Top", result);
return Response.status(200).entity(RealReult).build();
} /**
* 获取历史搜索记录
*/
@Override
public String getHistoryList(Integer page, Integer pagesize) {
LinkedList<Map<String, Object>> result = new LinkedList<>();
TransportClient client = getClient();
SearchResponse response = client.prepareSearch(ESConfig.SEARCHINDEX).setTypes(ESConfig.SEARCHTYPE)
.setQuery(QueryBuilders.matchAllQuery()).addSort("createDate", SortOrder.DESC)
.setFrom(pagesize * (page - 1)).setSize(pagesize).get();
SearchHits myhits = response.getHits();
for (SearchHit hit : myhits) {
Map<String, Object> hitmap = hit.getSource();
HashMap<String, Object> map = new HashMap<>();
map.put("q", hitmap.get("message"));
map.put("usetime", hitmap.get("usetime"));
map.put("city", hitmap.get("city"));
map.put("ip", hitmap.get("clientip"));
map.put("total", myhits.getTotalHits());
map.put("time", hitmap.get("timestamp"));
result.add(map);
}
HashMap<String, Object> RealReult = new HashMap<>();
RealReult.put("rows", result);
RealReult.put("total", myhits.getTotalHits());
return JsonUtil.beanToJson(RealReult);
} public String getHighlightFieldString(SearchHit hit, String field) {
String content = "";
if (hit.getHighlightFields().containsKey(field)) {
Text[] text = hit.getHighlightFields().get(field).getFragments();
for (Text str : text) {
content = content + str;
}
}
return content;
} public TransportClient getClient() {
return ESUtil.getClient();
} class TopWord {
private String _id;
private int count; public String get_id() {
return _id;
} public void set_id(String _id) {
this._id = _id;
} public int getCount() {
return count;
} public void setCount(int count) {
this.count = count;
}
}
}

  

Elasticsearch Date类型使用技巧的更多相关文章

  1. Elasticsearch Date类型,时间存储相关说明

    资料 网址 Elasticsearch 插入时间字段时数据格式问题 https://segmentfault.com/a/1190000016296983 Elasticsearch Date类型,时 ...

  2. Elasticsearch date 类型详解

    引言 一直对 elasticsearch 中的 date 类型认识比较模糊,而且在使用中又比较常见,这次决定多花些时间,彻底弄懂它,希望能对用到的同学提供帮助. 注意:本文测试使用是 elastics ...

  3. Oracle-数据类型为date 日期查询技巧

    date类型是oracle中存储日期类的一种常用类型,其处理也是在数据库使用中比较多需要注意的地方.如我们可以使用to_char函数将其转化为任意时间格式的字符串,也可使用to_date函数转化相应的 ...

  4. Elasticsearch 日期类型的自动监测,官方文档

    资料 网址 Elasticsearch Reference [7.3] » Mapping » Field datatypes » Date datatype https://www.elastic. ...

  5. 【Spring】SpringMVC中浅析Date类型数据的传递

    在控制器中加入如下代码: @InitBinder public void initBinder(ServletRequestDataBinder bin){ SimpleDateFormat sdf ...

  6. 向mysql中插入Date类型的数据

    先看数据库表的定义 date字段为sql.date类型.我要向其中插入指定的日期和当前日期. 一.插入当前日期 思路:先获取当前系统,在将当前系统时间转换成sql类型的时间,然后插入数据库.代码如下 ...

  7. java基础--java.util.Date类型小结

    首先先来了解一下Date数据类型: . Date类型通常要和另一个 java.text.SimpleDateFormat类联合使用. 把long-->Date: public Date(long ...

  8. ES数据-MySql处理Date类型的数据导入处理

    用ES的小伙伴们,相信大家都遇到过Mapping处理Date类型的数据头疼问题吧. 不用头疼了,我来给你提供一种解决方案: 1.Maping定义为: {  "mappings": ...

  9. java 中的SimpleDateFormat、Date函数以及字符串和Date类型互转

    SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类.它允许进行格式化(日期 -> 文本).解析(文本 -> 日期)和规范化. SimpleDateFor ...

随机推荐

  1. IOS设计模式第六篇之适配器设计模式

    版权声明:原创作品,谢绝转载!否则将追究法律责任. 那么怎么使用适配器设计模式呢? 这个之前提到的水平滚动的视图像这样: 为了开始实现他,我们创建一个新的继承与UIView的HorizontalScr ...

  2. Clojure 学习入门(14)—— 循环控制

    Clojure 基于函数的流程控制   repeatedly 字面意思为重复函数.一般的用法如下: #(rand-int 11)) 8 2 6 6) 重复产生5次随机数.rand-int 11表示0至 ...

  3. Android 查看system/bin目录下支持哪些命令?

    C:\Users\yonghuming>adb shell "ls system/bin" >log acpiadbdamapp_processapp_process3 ...

  4. 【BZOJ4919】[Lydsy六月月赛]大根堆 线段树合并

    [BZOJ4919][Lydsy六月月赛]大根堆 Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切 ...

  5. [心跳] 使用心跳机制实现CS架构下多客户端的在线状态实时更新以及掉线自动重连

    此文讲述的内容是一个实际项目开发中的一部分内容,笔者将亲身经历写成文章. [背景] 现 需要实现这样的功能:有多个客户端连着同一个服务器.服务器和客户端之间需要“互相”知道彼此的连接状态.比如在某一时 ...

  6. Kendo UI使用小小记

    之所以说小小记,是因为我根本没有好好用它,只是正好前些日子接触了一下,觉得还不错,随手记记~ 契机 我从加入现在这个公司以来,半专业的承担了很多前端相关的事情,用过不少前端框架,也为框架和原生的页面写 ...

  7. New text file line delimiter

    Window -> Preferences -> General -> Workspace : Text file encoding :Default : 选择此项将设定文件为系统默 ...

  8. POJ--1050--To the Max(线性动规,最大子矩阵和)

    To the Max Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44723 Accepted: 23679 Descript ...

  9. 一次使用Python连接数据库生成二维码并安装为windows服务的工作任务

    最近有一个需求,在现有生产系统上的人员库中增加一个此人员关键信息的二维码,支持文字版和跳转版两种方式,与报表工具关联,可打印.以windows服务方式,定时检查,只要发现某人员没有此二维码信息,就生成 ...

  10. HDU 3507 - Print Article - [斜率DP]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 Zero has an old printer that doesn't work well s ...