Elasticsearch Java API 獲取version,以及數(shù)據(jù)_version的介紹
更多的 Elasticsearch ,請點擊這里: Elasticsearch教程 ,本博客主要針對2.0 以上的 Elasticsearch 版本相關(guān)使用,以Java API 為主,適用于初級 Elasticsearch 使用者參考。如果有問題可以加群一起討論。
- Elasticsearch教程(一),全程直播(小白級別)
- Elasticsearch教程(二),IK分詞器安裝
- Elasticsearch教程(三),IK分詞器安裝 (極速版)
- Elasticsearch安裝(四), elasticsearch head 插件安裝和使用。
- Elasticsearch教程(五) elasticsearch Mapping的創(chuàng)建
- Elasticsearch教程(六) elasticsearch Client創(chuàng)建
- Elasticsearch教程(七) elasticsearch Insert 插入數(shù)據(jù)(Java)
- Elasticsearch教程(八) elasticsearch delete 刪除數(shù)據(jù)(Java)
- Elasticsearch教程(九) elasticsearch 查詢數(shù)據(jù) | 分頁查詢
- Elasticsearch權(quán)威指南-中文.pdf
本篇主要講解的是,在批量獲取數(shù)據(jù),或者查詢數(shù)據(jù)后,要獲取當(dāng)前數(shù)據(jù)操作的_version ,我今天發(fā)現(xiàn)獲取的_version 是-1 ,然后看下源碼發(fā)現(xiàn)默認(rèn)值就是-1 ,查詢的結(jié)果response ,里面根本就沒有version ,網(wǎng)上不知道是我姿勢不對還是就是沒有資料,后來找了相關(guān)文檔,咨詢了一些人。找到了答案。
本站的應(yīng)用實現(xiàn),你可以點擊:http://suancuo.cn/me/history.shtml 這個鏈接是查看你在本站瀏覽了哪些頁面,業(yè)務(wù)邏輯是,你訪問一個頁面超過2秒,就會記錄這個頁面的鏈接和標(biāo)題,再次訪問,會再插入一次,這時候會更新訪問時間和_version,也就是達到我要的效果了。
這個鏈接可以通過,在本站任意頁面,鼠標(biāo)單擊右鍵。點擊“瀏覽記錄”就可以跳轉(zhuǎn)到這個頁面。
應(yīng)用場景舉個栗子:
一、記錄用戶對某一個實物操作的次數(shù),如簡單的熱詞搜索,不用記錄信息,只要知道哪些詞搜索了多少次。
解決方案:
1.每一次插入數(shù)據(jù),然后count 總和一下。
2.每一次插入前,先查找,然后有就count++ ,沒有就insert一條數(shù)據(jù)。
3.。。。
二、頁面訪問次數(shù),不需要記錄訪問的信息,就想知道頁面訪問了多少次。
解決方案:和第一點相同。
三、單純的就是想知道數(shù)據(jù)操作了多少次,操作包過,覆蓋(同“_id” 插入),update等操作。這時候_version 可以直接用。
下面來看看這個_version。
我們用 head 插件查看下數(shù)據(jù)( head插件安裝 ):
上面看到了_version 為 1 ,那么這條數(shù)據(jù)就是操作了一次,也可以說是初始數(shù)據(jù)。
我們再來看看一個操作很多次數(shù)的數(shù)據(jù)。
上面的這個_version 是36 ,也就是操作了36 次。
Java API查詢關(guān)于_version的獲取。
單條數(shù)據(jù)查詢:
//創(chuàng)建查詢
GetRequest rq = new GetRequest(MappingManager.INDEX, MappingManager.TYPE, id);
//執(zhí)行查詢
GetResponse response = ESTools.client.get(rq).actionGet();
//獲取viersion
long version = response.getVersion();
System.out.printf("ID:%s的version為:%s",id, version);這個時候能獲取到到數(shù)據(jù)的version ,單條查詢是默認(rèn)開啟version 的。
批量查詢:
這里隨便拿個業(yè)務(wù)代碼做解析。
/**
* 瀏覽記錄,分頁查詢
* @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);
//根據(jù)用戶key查詢
srb.setQuery(QueryBuilders.termQuery("key",key) ) ;
/**設(shè)置返回version,默認(rèn)是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();
//先創(chuàng)建,防止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, "轉(zhuǎn)換為失敗,Data[%s]", json.toString());
continue;
}
}
page.setList(list);
return page;
} 這個地方的一個操作srb.setVersion(Boolean.TRUE); 是關(guān)鍵,如果不設(shè)置,不管怎么查詢,返回的都是-1,老版本我記得沒這個,這是新版本的一個優(yōu)化。
我們看下源碼:
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;//這里源碼默認(rèn)值,沒開啟就會返回默認(rèn)值“-1”
private BytesReference source;
......................此處省略...........................Just let it be!
有問題加群解決。。。或者留言。。。
版權(quán)所屬:SO JSON在線解析
原文地址:http://suancuo.cn/blog/126.html
轉(zhuǎn)載時必須以鏈接形式注明原始出處及本聲明。
如果本文對你有幫助,那么請你贊助我,讓我更有激情的寫下去,幫助更多的人。
