Elasticsearch Java API 获取version,以及数据_version的介绍

JSON 2016-08-22 18:52:24 22304

更多的 Elasticsearch  ,请点击这里: Elasticsearch教程   ,本博客主要针对2.0 以上的 Elasticsearch  版本相关使用,以Java API 为主,适用于初级 Elasticsearch  使用者参考。如果有问题可以加群一起讨论。

本篇主要讲解的是,在批量获取数据,或者查询数据后,要获取当前数据操作的_version ,我今天发现获取的_version -1 ,然后看下源码发现默认值就是-1 ,查询的结果response ,里面根本就没有version ,网上不知道是我姿势不对还是就是没有资料,后来找了相关文档,咨询了一些人。找到了答案。

本站的应用实现,你可以点击:https://www.sojson.com/me/history.shtml 这个链接是查看你在本站浏览了哪些页面,业务逻辑是,你访问一个页面超过2秒,就会记录这个页面的链接和标题,再次访问,会再插入一次,这时候会更新访问时间和_version,也就是达到我要的效果了。

这个链接可以通过,在本站任意页面,鼠标单击右键。点击“浏览记录”就可以跳转到这个页面。


应用场景举个栗子:

一、记录用户对某一个实物操作的次数,如简单的热词搜索,不用记录信息,只要知道哪些词搜索了多少次。

解决方案:

    1.每一次插入数据,然后count 总和一下。

    2.每一次插入前,先查找,然后有就count++ ,没有就insert一条数据。

    3.。。。

二、页面访问次数,不需要记录访问的信息,就想知道页面访问了多少次。

解决方案:和第一点相同。

三、单纯的就是想知道数据操作了多少次,操作包过,覆盖(同“_id” 插入),update等操作。这时候_version 可以直接用。

下面来看看这个_version。

我们用 head  插件查看下数据( head插件安装  ):

上面看到了_version 1 ,那么这条数据就是操作了一次,也可以说是初始数据。

我们再来看看一个操作很多次数的数据。

上面的这个_version 36 ,也就是操作了36 次。

Java API查询关于_version的获取。

单条数据查询:

//创建查询
GetRequest rq = new GetRequest(MappingManager.INDEX, MappingManager.TYPE, id);
//执行查询
GetResponse response = ESTools.client.get(rq).actionGet();
//获取viersion
long version = response.getVersion();
System.out.printf("ID:%s的version为:%s",id, version);

这个时候能获取到到数据的version ,单条查询是默认开启version 的。

批量查询:

这里随便拿个业务代码做解析。

/**
 * 浏览记录,分页查询
 * @param key		用户key
 * @param pageSize	size
 * @param pageNo	no
 * @return			分页对象
 */
public static Pagination findByHistoryPage(String key, Integer pageSize, Integer pageNo) {
	Pagination page = new Pagination();
	pageNo = null==pageNo?1:pageNo;
	page.setPageNo(pageNo);
	page.setPageSize(pageSize);
	
	
	Client client = ESTools.client;
	SearchRequestBuilder srb = client.prepareSearch(BaseMapping.HISTORY_INDEX);
	//根据用户key查询
    srb.setQuery(QueryBuilders.termQuery("key",key) )  ;
	/**设置返回version,默认是false**/
    srb.setVersion(Boolean.TRUE);
    srb.addSort("createDate", SortOrder.DESC);
	srb.setFrom((pageNo - 1) * pageSize).setSize(pageSize)
	.setExplain(Boolean.TRUE);
	//get() == execute().actionGet(); 新版本把execute().actionGet() 封装成get().
	SearchResponse response = srb.get();
	SearchHits hits = response.getHits();
	//total
	int total = (int)hits.getTotalHits();
	page.setTotalCount(total);
	
	List list = new ArrayList(total);
	for (SearchHit searchHit : hits) {
		Map source = searchHit.getSource();
		String id = searchHit.getId();
		//获取version,作为count返回
		long v = searchHit.getVersion();
		//先创建,防止catch后 null.toString()异常。
		JSONObject json = new JSONObject();
		try {
			json = JSONObject.fromObject(source);
			HistoryBo entity = (HistoryBo) JSONObject.toBean( json, HistoryBo.class);
			entity.setCount(v);
			entity.setKey(id);//把ID取出来,给key赋值,方便删除操作
			list.add(entity);
		} catch (Exception e) {
			LoggerUtils.fmtError(SelectManager.class, e, "转换为失败,Data[%s]", json.toString());
			continue;
		}
	}
	page.setList(list);
	return page;
	
}

这个地方的一个操作srb.setVersion(Boolean.TRUE); 是关键,如果不设置,不管怎么查询,返回的都是-1,老版本我记得没这个,这是新版本的一个优化。

我们看下源码:

public class InternalSearchHit implements SearchHit {

    private static final Object[] EMPTY_SORT_VALUES = new Object[0];

    private transient int docId;

    private float score = Float.NEGATIVE_INFINITY;

    private Text id;
    private Text type;

    private InternalNestedIdentity nestedIdentity;

    private long version = -1;//这里源码默认值,没开启就会返回默认值“-1”

    private BytesReference source;

    ......................此处省略...........................

Just let it be!
有问题加群解决。。。或者留言。。。


版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/126.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

关于作者
一个低调而闷骚的男人。
相关文章
Elasticsearch教程,Elasticsearch Java API创建Mapping,指定分词器
Elasticsearch教程(八) elasticsearch delete 删除数据Java
Elasticsearch 教程,Elasticsearch 日期查询详解,Elasticsearch Date 查询Java API
Elasticsearch 分词,Elasticsearch Java API 分词 操作
Java 获取时间戳的方法大全,以及速度比较
Elasticsearch 随机返回数据 API
Elasticsearch教程(七) elasticsearch Insert 插入数据Java
支付宝好友吱口令介绍,加好友吱口令获取图解
Java 随机从 List 随机获取多个不重复对象,Mysql 随机10条数据
Elasticsearch教程(九) elasticsearch 查询数据 | 分页查询
最新文章
实用API合集分享:教你轻松获取IP地址的API合集 45
Linux I/O重定向 5128
Ruby 循环 - while、for、until、break、redo 和 retry 2650
Node.js:全局对象 2416
如何使用终端检查Linux上的内存使用情况 2253
JavaScript对象详细剖析 2059
Python print() 函数 2014
PHP if/else/elseif 语句 2172
HTML5 Canvas弧线教程 1952
Java赋值运算符 2342
最热文章
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 689934
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 675483
免费天气API,天气JSON API,不限次数获取十五天的天气预报 644507
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 617128
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 558707
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 510524
Elasticsearch教程(四) elasticsearch head 插件安装和使用 482267
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 273739
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 245117
Elasticsearch教程(一),全程直播(小白级别) 228909
支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...