您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“如何解決ES查詢數(shù)據(jù)突然變?yōu)榭盏膯栴}”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何解決ES查詢數(shù)據(jù)突然變?yōu)榭盏膯栴}”吧!
elasticsearch版本:6.3.1
客戶端環(huán)境:kibana 6.3.4、Java8應(yīng)用程序模塊。 其中kibana主要用于數(shù)據(jù)查詢診斷和查閱日志,Java8為主要的客戶端,數(shù)據(jù)插入和查詢都是由Java實(shí)現(xiàn)的。
使用elasticsearch存儲訂單的主要信息,document內(nèi)的field,基本上是long或keyword,創(chuàng)建索引的order.json文件如下:
{ "doc": { "properties": { "id": { "type": "keyword", "index": true }, "status": { "type": "byte", "index": true }, "createTime": { "type": "long", "index": true }, "uid": { "type": "long", "index": true }, "payment": { "type": "keyword", "index": true }, "commentStatus": { "type": "byte", "index": true }, "refundStatus": { "type": "byte", "index": true } } } }
某天發(fā)現(xiàn)有個(gè)查詢功能(單獨(dú)使用payment字段查詢)沒有數(shù)據(jù)出來,最近未修改此部分代碼。對比研發(fā)環(huán)境,研發(fā)環(huán)境是正常的,同樣的代碼在測試環(huán)境下無數(shù)據(jù)返回。
程序中使用該字段用的是termQuery,如下:
QueryBuilders.termQuery("payment", req.getFilter().getOrder().getPayment())
在kibana上用命令診斷查詢數(shù)據(jù),同樣沒有結(jié)果返回,查詢命令如下:
GET /order/doc/_search { "query": { "bool": { "must": [ {"term": { "payment": "Alipay" }} ] } } }
查詢mapping信息,看是否為keyword:
GET /order/_mapping/doc
響應(yīng)返回(只展示payment字段):
{ "order": { "mappings": { "doc": { "properties": { "payment": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } } }
按照mapping返回結(jié)果來看,字段payment原定義的類型是keyword,現(xiàn)在變成text了,這個(gè)是payment字段使用termQuery查詢導(dǎo)致沒有數(shù)據(jù)的原因。
keyword對保存的內(nèi)容不分詞,也不改變大小寫,原樣存儲,默認(rèn)可索引。 text對內(nèi)容進(jìn)行分詞,并且全部小寫存儲,同時(shí)會(huì)增加一個(gè)text.keyword字段,為keyword類型,超過256字符后不索引。
由于payment字段變成text了,原有的程序使用term查詢,用的"Alipay",而text存儲的是"alipay",所以查不到數(shù)據(jù)了。
payment的值改成小寫
GET /order/doc/_search { "query": { "bool": { "must": [ {"term": { "payment": "alipay" }} ] } } }
或?qū)erm查詢改成match查詢
GET /order/doc/_search { "query": { "bool": { "must": [ { "match": { "payment": "alipay" } } ] } } }
查詢有數(shù)據(jù)輸出,并且符合預(yù)期,嘗試方法有效。
明明order.json的對payment字段定義的類型是keyword,怎么變成text了?
由于出現(xiàn)此問題的環(huán)境是測試環(huán)境,有重刪索引數(shù)據(jù),然后再全部導(dǎo)入的操作(有點(diǎn)不規(guī)范,但僅限于測試環(huán)境,生產(chǎn)環(huán)境不會(huì)這么做),重新導(dǎo)入索引document數(shù)據(jù)的功能,es創(chuàng)建索引自動(dòng)mapping時(shí),payment字段的string內(nèi)容,會(huì)變成text。
1.刪除索引
DELETE /order
2.按照order.json重建索引
PUT /order { "mappings": { "doc": { "properties": { "id": { "type": "keyword", "index": true }, "status": { "type": "byte", "index": true }, "createTime": { "type": "long", "index": true }, "uid": { "type": "long", "index": true }, "payment": { "type": "keyword", "index": true }, "commentStatus": { "type": "byte", "index": true }, "refundStatus": { "type": "byte", "index": true } } } } }
3.觸發(fā)程序灌數(shù)據(jù)(也可以用bulk)
到此,相信大家對“如何解決ES查詢數(shù)據(jù)突然變?yōu)榭盏膯栴}”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。