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

soゝso 2016-08-22 18:52:24 3778
分享到:

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

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

本站的应用实现,你可以点击:http://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!
有问题加群解决。。。或者留言。。。


关于作者
目前就职于国内某电商平台公司打杂。。
相关文章
Elasticsearch 随机返回数据 API
Elasticsearch教程,Elasticsearch Java API创建Mapping,指定分词器
Elasticsearch 分词,Elasticsearch Java API 分词 操作
Elasticsearch教程(八) elasticsearch delete 删除数据Java
Elasticsearch教程(七) elasticsearch Insert 插入数据Java
Java 获取时间戳的方法大全,以及速度比较
Elasticsearch 教程,Elasticsearch 日期查询详解,Elasticsearch Date 查询Java API
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报
Java获取域名,Java从URL地址中获取域名,Java从Request 获取域名
Elasticsearch教程(九) elasticsearch 查询数据 | 分页查询
最新文章
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 38754
JS解密,JavaScript 解密,任何JS加密都能100%解密,以及JS 加密讲解 66
阿里云DNS 解析讲解,SEO配置搜索引擎线路解析 41
百度秒收录教程,怎么做到百度秒收入你的页面,SEO 教程 89
CDN 请求返回 connection reset by peer,被拦截请求解决方案 33
Google AdSense 申请技巧,谷歌广告申请通不过教程 66
Mac 安装 JMeter,JMeter 下载,JMeter Http 压力测试【图解】 45
支付宝吱口令自动复制脚本,自动复制 JavaScript 代码介绍 866
谈谈这次对 SOJSON 的改版 146
Java 计算2个时间相差多少年,多少个月,多少天的几种方式 484
最热文章
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 38754
Elasticsearch教程(四) elasticsearch head 插件安装和使用 108910
Elasticsearch教程(六) elasticsearch Client创建 73264
Elasticsearch教程(八) elasticsearch delete 删除数据(Java) 70727
Elasticsearch教程(二),IK分词器安装 67441
Elasticsearch教程(三),IK分词器安装 (极速版) 54071
Elasticsearch教程(五) elasticsearch Mapping的创建 51534
Elasticsearch教程(一),全程直播(小白级别) 51227
Elasticsearch教程(七) elasticsearch Insert 插入数据(Java) 47703
Elasticsearch权威指南-中文.pdf,Elasticsearch 中文文档下载 40877

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

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

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

支付扫码

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

正在加载... ...