最近在研究elasticsearch 5.x版本的新特性的時候,偶爾翻到一篇es的測試文章,對于mapping的配置直接干掉了_all和_source選項。
對于_all選項的關(guān)閉我倒是可以理解,但是如果關(guān)掉_source選項的話,那返回數(shù)據(jù)就是一堆空的字典了。
所以看到這篇文章,我的第一感覺是: 臥草,還有這樣的騷操作?!這是完全是把es當(dāng)索引用了啊。
但是對于Hbase和mongodb存儲的數(shù)據(jù),這樣搞也沒什么壞處。通過索引拿到rowkey/_id, 然后直接從Hbase/mongodb里取數(shù)據(jù)。
這里我做了如下實驗,首先配置mapping:
mapping_body = {
"article": {
"_all": {"enabled": False},
"_source": {"enabled": False},
"properties": {
# 各種字段。。。
},
},
}
然后把mongo中的數(shù)據(jù)導(dǎo)入到es中。一共666380條數(shù)據(jù),id為數(shù)據(jù)的唯一字段ac_no, 存儲空間占了18M。
首先進(jìn)行普通查詢:
search_result = es.search(index=index_name,
body=search_body, preference="primary")
由_source禁止掉了,所以返回的數(shù)據(jù)內(nèi)容都是空,所以只能拿到id。通過id再在mongodb中進(jìn)行$in查詢:
result = search_result[u'hits'][u'hits']
id_list = [int(i["_id"]) for i in result]
query = list(coll.find({"ac_no":{"$in":id_list}}, {"_id": 0}))
最后得到所有數(shù)據(jù)。要得到跟_source關(guān)閉前一樣的結(jié)果,還需要做點處理,保證結(jié)果排序的一致,這里不再贅述。
如果_source開啟,存儲同樣的數(shù)據(jù)需要28M,節(jié)省的空間還是比較顯著的。