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

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

更多的 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!
有问题加群解决。。。或者留言。。。


版权所属:SO JSON在线解析

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

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

本文主题:

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

相关文章
Elasticsearch Java API 获取version以及数据_version介绍
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 获取域名
最新文章
Macbook teamviewer 突破5分钟,苹果电脑重置 Mac 地址,100%解决限制 271
腾讯云代金券 10000 元/ 30000 代金券领取技巧 351
SEO 换友情链接的主意事项,友情链接断链、友情链接套路说明 236
Springboot + Mybatis,数据库多数据源配置项目Demo【源码下载】 1934
Mac mtr 安装并使用,mrt: command not found 301
Java 集成阿里云消息队列,日志消息存储 501
域名备案注意事项,网站域名ICP备案快速通过攻略【干货分享】 487
Springboot 集成Aliyun MQ消息队列,Aliyun 消息队列配置及代码实现 842
SpringBoot 集成Spring-data-redis,redis对象序列化存储 2050
天气API,全国天气 JSON API接口,可以获取十五天的天气预报 616
最热文章
Elasticsearch教程(四) elasticsearch head 插件安装和使用 126843
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 108648
Elasticsearch教程(六) elasticsearch Client创建 78834
Elasticsearch教程(八) elasticsearch delete 删除数据(Java) 74451
Elasticsearch教程(二),IK分词器安装 73235
Elasticsearch教程(一),全程直播(小白级别) 65840
Elasticsearch教程(五) elasticsearch Mapping的创建 61925
Elasticsearch教程(三),IK分词器安装 (极速版) 56373
Elasticsearch教程(七) elasticsearch Insert 插入数据(Java) 53569
Java 解析JSON,JSON-LIB jar包下载和使用。 49041

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

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

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

支付扫码

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

正在加载... ...