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

soゝso 2016-08-22 18:52:24 5935

更多的 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

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

本文主题:

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

相关文章
SOJSON.COM 站点介绍
JSON格式讲解,JSON获取对象,JSONObject和JSONArray的操作
Java 解析JSON,JSON-LIB jar包下载和使用。
JSON数据格式,JSON格式化介绍,JSON格式介绍。
JSON.stringify 函数 (JavaScript)讲解
怎么合理管理、提高Javascript的性能
Javascript 删除节点后是否需要将手动将事件解绑?
JavaScript function 类型的使用说明
MySql数据库优化注意的四个细节(方法)
MySQL数据库存储过程字符集问题,乱码的解决办法
最新文章
ICP怎么操作取消备案,企业、个人怎么自己申请取消备案? 15
Javascript 加密/压缩后运行不了,JavaScript报错排查讲解 41
JavaScript 不可逆加密问题排查之方案一(闭包优化) 45
Java爬虫,Jsoup 爬取大众点评、美团商家信息电话号码解决方案 241
分解质因数 JavaScript 计算方式,及分解质因数讲解 7
湖南腾众4s店服务怎么样?进来看看你就知道了 29
SEO 之 SpringMVC redirect 301,301和302区别详细讲解 82
网站如何设置404页面、500等错误页面,有什么漏洞?怎么预防? 101
Java 文字转图片输出,Java 输出透明背景图片,Java文字转图片防爬虫 153
HttpClient获取访问域名的真实ip,HttpClient请求获取目标IP地址 298
最热文章
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 175170
Elasticsearch教程(四) elasticsearch head 插件安装和使用 138295
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 117930
Elasticsearch教程(六) elasticsearch Client创建 81985
Elasticsearch教程(一),全程直播(小白级别) 77083
Elasticsearch教程(二),IK分词器安装 77057
Elasticsearch教程(八) elasticsearch delete 删除数据(Java) 76748
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 75112
Elasticsearch教程(五) elasticsearch Mapping的创建 69392
Elasticsearch教程(三),IK分词器安装 (极速版) 58147

骚码加入我们 / 千人QQ群:259217951

入群需要5元,如果没有QQ钱包,可以先Alipay、微信,赞助然后加群主拉进。

二维码生成 来自 >> 二维码生成器

支付扫码

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

正在加载... ...