實際是利用springdataJPA對ES操作。
1. pom文件增加:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <!--QueryDSL支持 --> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> </dependency>
2. application.properties 增加如下配置
spring.data.elasticsearch.cluster-name=my-application
spring.data.elasticsearch.cluster-nodes= 127.0.0.1:9300
3.Java新建類
bean: 類型
package cn.qlq.es; import javax.persistence.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; import lombok.Data; @Data @Document(indexName = "testdoct") public class TestBean { // 必須指定一個id, @Id private long id; // 這里配置了分詞器,字段類型,可以不配置,默認也可 @Field(analyzer = "ik_smart", type = FieldType.Text) private String name; private Integer age; @Field(analyzer = "ik_smart", type = FieldType.Text) private String sex; @Field(analyzer = "ik_smart", type = FieldType.Text) private String desc; public TestBean() { } public TestBean(long id, String name, Integer age, String sex, String desc) { this.id = id; this.name = name; this.age = age; this.sex = sex; this.desc = desc; } }
dao如下:
package cn.qlq.es; import java.util.List; import org.springframework.data.repository.PagingAndSortingRepository; public interface TestDao extends PagingAndSortingRepository<TestBean, Long> { List<TestBean> findByName(String name); List<TestBean> findByNameOrDesc(String name, String desc); }
service:
package cn.qlq.es; import java.util.List; import org.springframework.data.domain.Page; public interface TestService { Iterable<TestBean> findAll(); void save(List<TestBean> list); void save(TestBean bean); List<TestBean> findByName(String text); List<TestBean> findByNameOrDesc(String name, String desc); Page<TestBean> page(int pageNum); }
實現類:
package cn.qlq.es; import java.util.ArrayList; import java.util.List; import java.util.Random; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.querydsl.QPageRequest; import org.springframework.stereotype.Service; @Service public class TestServiceImpl implements TestService { @Autowired TestDao testDao; @Override public Iterable<TestBean> findAll() { return testDao.findAll(); } @Override public void save(List<TestBean> list) { list = new ArrayList<>(); String namess = "帆乘 楷棟 鋒楓 海勇 康帆 安禮 曉平 良帆 瑞翱 濤錕 恆勇 鴻馳 帆強 桓柏 鋒寅 博槐 騫琛 桓釗 傑桓 裕楓 福暉 槐仕 奇鵬 駿偉 允濰 乘初 杞郁 柏安 皓宇 駿俠 禮德 哲曉 偉權 祥恆 澄震 浩浩 瑞權 延升 翱楷 鋒軒 馳鵬 杞翱 康鶴 材福 暉銳 信恆 凱錦 誠翱 震福 龍宇 祥帆 梓瑞 林龍 日延 槐翰 日寅 起鴻 杞允 瑞銳 仕星 權銘 吉楷 寅星 林帝 皓仕 卓禮 家盛 海寅 盛胤 年禧 暢安 炳龍 柏暉 誠年 彬坤 禮誠 濡凱 馳晨 恆邦 帆暉 誠華 暉星 恆梓 祿彬 鶴華 錕升 桓浩 振堯 祥寅 楷辰 暄帝 銳梓 恆佑 文安 傑暢 加琛 俊澤 乘馳 祿家 中鶴 家錦 皓初 凱震 文韋 彬澄 起哲 海炳 鶴鋒 賢逸 哲佑 海信 逸俊 炳年 禮郁 濡寅 曉澤 然延 喆加 天梓 澤錕 軒諦 盛翱 晨子 誠吉 梁鶴 仕逸 升平 奇琛 杞沛 胤邦 辰佑 騫佳 鴻鵬 翱坤 釗峰 哲銳 騰鑫 海陽 爍奇 安芃 浩瑞 星堯 馳炳 安沛 權成 華文 杞晨 柏柔 權彬 禎晨 諦濰 馳安 安日 谷沛 帆華 林翰 然震 琛星 澤杞 澄濤 龍欣 嘉辰 海祿 誠家 帆韋 澄濡 濰延 郁邦 銳禮 蔓材 暢震 騰誠 峰賢 軒濰 凡信 翱年 祜帆 睿吉 禎博 強延 震鑫 邦郁 禧禎 良梁 爍諦 成震 翱顏 加升 榮俊 晨騫 錦槐 爍安 鑫平 沛凱 德升 炳宇 遠俠 暉鵬 騰谷 初帆 林然 中祿 斌顏 顏浩 遠帆 胤然 祜沛 允錕 暢梁 棟材 澤柔 遠銳 杞梁 凱濡 郁槐 家澤 暄乘 年權 文柏 濰禧 澄禧 奇錦 逸然 翰弘 華海 柏辭 瑞星 胤佑 芃嘉 祜胤 逸傑 傑逸 材龍 允升 加韋 逸福 桓辭 楓濡 信然 棟禎" + "蓓菡 娜嘉 碧珊 菲昕 芸帆 怡莉 鴻蓮 曦靜 靈玥 橘婧 家曼 鶴麗 嵐琳 格梅 呈夢 璇嘉 月欣 楠敏 瑤麗 茹蓮 杉歆 帆珍 琬彬 蓓昭 函璇 凌歡 歆蔚 妮萱 琛靈 婷媛 琳凌 嵐冬 靜鴻 珍倩 桂楓 玉嵐 紫涵 桃婧 芳璟 韻珠 香萱 冰梅 桂寒 呈曼 梅茹 雯帆 芙明 紫桂 霞玲 蓓莉 霞可 琪香 菲春 美俊 夢梔 鶴婧 帛菲 靜芝 琳沛 玥薇 璟漫 弦茹 彥茜 花梓 歆曦 寒潔 莉梓 穎芙 梓露 玉詩 桃橘 鶴霞 沛漫 月婧 玲陽 雅歡 珍月 璟紫 歆淑 韻琬 月玉 歡彥 寒婭 妍彤 夢萱 蕾芳 心彤 彩妮 寒玲 淑漫 茜桐 春楠 洲茜 月嘉 欣雲 珠香 嵐韻 娜呈 妮弦 芸函 芳寒 萱林 雲琳 蓮菡 碧婭 莉凌 梔茜 蔚妮 惠婧 香心 初莉 穎淑 凡芝 璇靈 可蕾 靜文 彩鶴 芙鑫 花楠 雲夢 菲茹 蓓玥 惠婭 凌芳 柔旭 琛楠 雪娜 蕾詩 芸珠 菡桂 蕾文 桃花 彩詩 彬潔 帆馨 雯春 芝韻 春雅 靜紫 寒橘 冰淑 韻露 昭蓮 詩晨 鈺花 彩月 昕歡 香可 菲婧 橘靜 鈺韻 霞心 彬雅 芙春 菲惠 萱曦 惠楓 舒薇 楠麗 梔珍 琳惠 歆冬 漫月 蓮琛 琬梓 雨美 夢家 倩慧 俊薇 彬璇 敏玉 梔曼 曦倩 蓓蔚 月茜 俊珍 茹帆 璐歡 芝珊 昕舒 婭璐 慧玉 春玥 舒靜 穎楠 淑紫 漫彩 歡曼 芳歆 桂冰 芙薇 旭雅 璇冰 嵐欣 嵐玲 慧錦 克霞 萱麗 采碧 潔昭 采彩 珊雲 漫夢 萱凌 怡文 霞杉 敏怡 莉怡 怡露 格漫 瑤薇 沛菲 彥夢 妮馨 菲萱 敏桐 鶴菡 彬蓓 凌彤 珊莉 漫依 琪蓮 欣霞 璟心 梅薇 寒蓓 倩梓 采娜 琬雯 楓梅 花格 馨可 杉璐 舒婭 沛香 穎茹 格玲 花柏 雨璟 欣薇"; String[] names = namess.split("\\s+"); String[] descArr = { "大家好,我是雨天,因為剛好出生在雨天,老爸又剛好姓夏,於是“下雨天”就首發出場了,而且媽媽也希望我如雨后春筍、天天向上哦!呵呵后來因為一部分人實在不忍心在晴朗的天氣里叫我雨天,為避免引起“混亂”,就只好舍棄了這個頗有個性的簡單名字,退而成“小名“了。我的大名也簡單,其實就一個“翌”字,因為我出生的日子剛好是爸爸媽媽結婚2周年紀念日的第二日。“夏翌”諧音寧波話“暇意”,大家希望我暇暇意意,呵呵,有點嫌”翌”字太文縐縐,就把它給拆了,一分為二成羽立了。", "大家都說我是個陽光女孩,因為我是開心果啊。我老是坐不住,呵呵,能跟小椅子成為好朋友,是老師和爸爸媽媽現在的最大心願。我喜歡跳舞,但最好能跟着音樂自己起舞,不用按老師的要求練基本功;我喜歡畫畫,但最好是信手塗鴉,把小朋友的臉畫成綠色也沒關系;我喜歡溜冰,但最有趣的還是約上三五好友,一起練習如何摔跤……", "昀昀是我在媽媽肚子里時的小名哦,我的大名叫曹鐵瀛,媽媽懷我的時候和單位里的阿姨們玩牌經常是百戰百勝,阿姨們說是因為我的緣故,干脆就叫“天贏”好了,爸媽取其諧音,就變成了“鐵瀛”", "嘿!我——21號來報到了!智誥、誥誥、阿誥,你們愛怎么叫就怎么叫吧!反正都是我!我的名字是奶奶請一名先生取的,雖然有點迷信,但寄托了全家人的祝福!", "還是汽車發燒友,小轎車、大卡車、集裝箱、大客車、翻斗車、壓路機……應有盡有(就差拖拉機還沒有報到)。我常在家練習倒車、移庫、爬坡、過單軌橋,考取駕照不成問題!!當然我也模擬制造幾起車禍,掉進大河,深溝,追尾事故,因為那時我又能大顯身手,汽車的零件裝了又拆,拆了又裝……哈哈!!角角落落都是我的傑作,缺胳膊少腿的,七零八落的,盡管汽車多,可完完整整的沒幾輛!這下,又有理由去買車啦!", "我還喜歡畫畫。從小我就拿着筆畫一個個的大圓圈,每天樂此不疲,整整畫了半年多圓圈呢!夠有毅力的吧!老師說我構圖線條流暢,就是那樣練出來的哦!以后我一定會繼續努力的!可是我不太喜歡看書,媽媽讓我看書,我老是心不在焉,左顧右盼,常常惹她不高興,可我就是不喜歡嘛!", "我的性格有點內向、靦腆、不喜歡“顯山露水”。我最喜歡體育項目了,最“痴迷”的就是體育頻道:乒乓球、羽毛球、台球、足球、籃球、跳水~~,當然我也喜歡打牌(這可是遺傳)。", "我的個子很高,被稱為“帥哥”,因此彼得女孩子的歡心哦,等我長大了,我要娶七個“老婆”,其中三個為:外婆、爸爸和媽媽。 我的目標是考上北大。\n", "我當時的第一反應是:這兩個字可以跟名人的名字做一個聯系,然后做一個介紹。我說你介紹的時候可以跟別人講:" }; Random random = new Random(); // 模擬數據 for (int i = 0; i < 100; i++) { int i1 = random.nextInt(names.length); int i2 = random.nextInt(descArr.length); // 注意這里 第一個參數是id 所以無論你運行多少次,都只會添加100條數據,如果id存在es更新,不存在添加 TestBean testBean = new TestBean(i, names[i1], i, String.valueOf(i % 2), descArr[i2]); list.add(testBean); } testDao.saveAll(list); } @Override public void save(TestBean bean) { testDao.save(bean); } @Override public List<TestBean> findByName(String text) { return testDao.findByName(text); } @Override public List<TestBean> findByNameOrDesc(String name, String desc) { return testDao.findByNameOrDesc(name, desc); } @Override public Page<TestBean> page(int pageNum) { // 構造請求參數,頁號從0開始,頁大小默認為5 QPageRequest qPageRequest = new QPageRequest(pageNum, 5); return testDao.findAll(qPageRequest); } }
Controller類:
package cn.qlq.es; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/estest") public class ESTestController { @Autowired private TestService testService; @RequestMapping("index") public String index() { return "index"; } @RequestMapping("page") public Page<TestBean> page(int pageNum) { return testService.page(pageNum); } @RequestMapping("findAll") public Iterable<TestBean> findAll() { return testService.findAll(); } @RequestMapping("saveBatch") public String save() { List<TestBean> list = null; testService.save(list); return "success"; } @RequestMapping("save") public void save(TestBean bean) { testService.save(bean); } @RequestMapping("findByName") public List<TestBean> findByName(String name) { return testService.findByName(name); } @RequestMapping("findByNameOrDesc") public List<TestBean> findByNameOrDesc(String name, String desc) { return testService.findByNameOrDesc(name, desc); } }
4. 啟動后測試
(1) 訪問增加
(2)kibana中測試:
GET testdoct/_doc/_search?q=加韋 { "query": { "match_all": {} } }
結果:
#! Deprecation: [types removal] Specifying types in search requests is deprecated.
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 7.572013,
"hits" : [
{
"_index" : "testdoct",
"_type" : "_doc",
"_id" : "0",
"_score" : 7.572013,
"_source" : {
"_class" : "cn.qlq.es.TestBean",
"id" : 0,
"name" : "加韋",
"age" : 0,
"sex" : "0",
"desc" : "我當時的第一反應是:這兩個字可以跟名人的名字做一個聯系,然后做一個介紹。我說你介紹的時候可以跟別人講:"
}
},
{
"_index" : "testdoct",
"_type" : "_doc",
"_id" : "22",
"_score" : 3.3623576,
"_source" : {
"_class" : "cn.qlq.es.TestBean",
"id" : 22,
"name" : "帆韋",
"age" : 22,
"sex" : "0",
"desc" : "我還喜歡畫畫。從小我就拿着筆畫一個個的大圓圈,每天樂此不疲,整整畫了半年多圓圈呢!夠有毅力的吧!老師說我構圖線條流暢,就是那樣練出來的哦!以后我一定會繼續努力的!可是我不太喜歡看書,媽媽讓我看書,我老是心不在焉,左顧右盼,常常惹她不高興,可我就是不喜歡嘛!"
}
},
{
"_index" : "testdoct",
"_type" : "_doc",
"_id" : "45",
"_score" : 3.3623576,
"_source" : {
"_class" : "cn.qlq.es.TestBean",
"id" : 45,
"name" : "帆韋",
"age" : 45,
"sex" : "1",
"desc" : "還是汽車發燒友,小轎車、大卡車、集裝箱、大客車、翻斗車、壓路機……應有盡有(就差拖拉機還沒有報到)。我常在家練習倒車、移庫、爬坡、過單軌橋,考取駕照不成問題!!當然我也模擬制造幾起車禍,掉進大河,深溝,追尾事故,因為那時我又能大顯身手,汽車的零件裝了又拆,拆了又裝……哈哈!!角角落落都是我的傑作,缺胳膊少腿的,七零八落的,盡管汽車多,可完完整整的沒幾輛!這下,又有理由去買車啦!"
}
}
]
}
}
(3) 測試分頁
訪問: http://localhost:8088/estest/page?pageNum=1
結果:
{
"content": [{
"id": 5,
"name": "穎芙",
"age": 5,
"sex": "1",
"desc": "大家都說我是個陽光女孩,因為我是開心果啊。我老是坐不住,呵呵,能跟小椅子成為好朋友,是老師和爸爸媽媽現在的最大心願。我喜歡跳舞,但最好能跟着音樂自己起舞,不用按老師的要求練基本功;我喜歡畫畫,但最好是信手塗鴉,把小朋友的臉畫成綠色也沒關系;我喜歡溜冰,但最有趣的還是約上三五好友,一起練習如何摔跤……"
}, {
"id": 6,
"name": "琬彬",
"age": 6,
"sex": "0",
"desc": "昀昀是我在媽媽肚子里時的小名哦,我的大名叫曹鐵瀛,媽媽懷我的時候和單位里的阿姨們玩牌經常是百戰百勝,阿姨們說是因為我的緣故,干脆就叫“天贏”好了,爸媽取其諧音,就變成了“鐵瀛”"
}, {
"id": 7,
"name": "春楠",
"age": 7,
"sex": "1",
"desc": "昀昀是我在媽媽肚子里時的小名哦,我的大名叫曹鐵瀛,媽媽懷我的時候和單位里的阿姨們玩牌經常是百戰百勝,阿姨們說是因為我的緣故,干脆就叫“天贏”好了,爸媽取其諧音,就變成了“鐵瀛”"
}, {
"id": 8,
"name": "玥薇",
"age": 8,
"sex": "0",
"desc": "大家都說我是個陽光女孩,因為我是開心果啊。我老是坐不住,呵呵,能跟小椅子成為好朋友,是老師和爸爸媽媽現在的最大心願。我喜歡跳舞,但最好能跟着音樂自己起舞,不用按老師的要求練基本功;我喜歡畫畫,但最好是信手塗鴉,把小朋友的臉畫成綠色也沒關系;我喜歡溜冰,但最有趣的還是約上三五好友,一起練習如何摔跤……"
}, {
"id": 9,
"name": "逸俊",
"age": 9,
"sex": "1",
"desc": "昀昀是我在媽媽肚子里時的小名哦,我的大名叫曹鐵瀛,媽媽懷我的時候和單位里的阿姨們玩牌經常是百戰百勝,阿姨們說是因為我的緣故,干脆就叫“天贏”好了,爸媽取其諧音,就變成了“鐵瀛”"
}],
"pageable": {
"sort": {
"orderSpecifiers": [],
"sorted": false,
"unsorted": true,
"empty": true
},
"offset": 5,
"pageSize": 5,
"pageNumber": 1,
"paged": true,
"unpaged": false
},
"aggregations": null,
"scrollId": null,
"maxScore": 1.0,
"totalElements": 100,
"totalPages": 20,
"size": 5,
"number": 1,
"sort": {
"orderSpecifiers": [],
"sorted": false,
"unsorted": true,
"empty": true
},
"numberOfElements": 5,
"first": false,
"last": false,
"empty": false
}