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

信息发布:soゝso 发布日期:2016-08-22 18:52 热度:650 分享到:

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


本文主题

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

¥我需要走的更远,点击我 赞助。 如果还有疑问,点击我加群,为你提供最好的解答。


工具导航地图

 
Nodejs + socket Demo 赞助二维码 赞助名单 百度口碑点赞 查看QQ群美女帅哥 点击加QQ群 听音乐 开启弹幕 X
反馈意见