Elasticsearch Java API 获取version,以及数据_version的介绍
更多的 Elasticsearch ,请点击这里: Elasticsearch教程 ,本博客主要针对2.0
以上的 Elasticsearch 版本相关使用,以Java API
为主,适用于初级 Elasticsearch 使用者参考。如果有问题可以加群一起讨论。
- Elasticsearch教程(一),全程直播(小白级别)
- Elasticsearch教程(二),IK分词器安装
- Elasticsearch教程(三),IK分词器安装 (极速版)
- Elasticsearch安装(四), elasticsearch head 插件安装和使用。
- Elasticsearch教程(五) elasticsearch Mapping的创建
- Elasticsearch教程(六) elasticsearch Client创建
- Elasticsearch教程(七) elasticsearch Insert 插入数据(Java)
- Elasticsearch教程(八) elasticsearch delete 删除数据(Java)
- Elasticsearch教程(九) elasticsearch 查询数据 | 分页查询
- Elasticsearch权威指南-中文.pdf
本篇主要讲解的是,在批量获取数据,或者查询数据后,要获取当前数据操作的_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。
上面看到了_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
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。