一、官方文档

https://esdoc.bbossgroups.com/#/README

二、官方demo

https://github.com/bbossgroups/elasticsearch-example.git

三、maven构建

<dependency><groupId>com.bbossgroups.plugins</groupId><artifactId>bboss-elasticsearch-rest-jdbc</artifactId><version>6.1.3</version><exclusions><exclusion><artifactId>slf4j-log4j12</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency><dependency><groupId>com.bbossgroups.plugins</groupId><artifactId>bboss-elasticsearch-spring-boot-starter</artifactId><version>6.1.3</version><exclusions><exclusion><artifactId>slf4j-log4j12</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency>

四、我的代码

1,application.yml

spring:elasticsearch:bboss:
#      elasticUser: elastic
#      elasticPassword: changemeelasticsearch:rest:hostNames: 127.0.0.1:9200dateFormat: yyyy.MM.ddtimeZone: Asia/ShanghaishowTemplate: truediscoverHost: falsedslfile:refreshInterval: -1http:timeoutConnection: 5000timeoutSocket: 5000connectionRequestTimeout: 5000retryTime: 1maxLineLength: -1maxHeaderCount: 200maxTotal: 400defaultMaxPerRoute: 200soReuseAddress: falsesoKeepAlive: falsetimeToLive: 3600000keepAlive: 3600000keystore:keyPassword:hostnameVerifier:

2,esmapper/search.xml

<properties><!--    构建书籍内容索引--><property name="createBookcontent"><![CDATA[{"settings": {"number_of_shards": 1,"index.refresh_interval": "5s"},"mappings": {"properties": {"name":{"type":"text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"hid": {"type": "keyword"},"lastSection": {"type": "keyword"},"nextSection": {"type": "keyword"},"sectionName": {"type": "keyword"},"sectionNote": {"type": "text"}}}}]]></property><!--     关键字检索检索--><property name="searchPagineDatas"><![CDATA[{"query": {#if($keyword)"multi_match": {"query": #[keyword],"type": "most_fields","fields": [#foreach($column in $columns)#if($velocityCount > 0),#end"$column"#end]}#else"match_all": {}#end},"track_total_hits": true,"from":#[from],"size":#[size]}]]></property><!--    ## 根据hid查找书籍内容--><property name="searchBookContent"><![CDATA[{"query": {"term": {"hid": #[hid]}},"track_total_hits": true,"size": 1}]]></property><!--  使用父子文档存储书籍及其目录  --><property name="createBookIndex"><![CDATA[{"settings": {"number_of_shards": 1,"index.refresh_interval": "5s"},"mappings": {"properties": {"name":{"type":"text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"id0":{"type":"keyword"},"hi0": {"type": "keyword"},"directory0": {"type": "text"},#foreach($i in [1,2,3])#if($velocityCount > 0),#end"id$i":{"type":"keyword"},"hi$i": {"type": "keyword"},"directory$i": {"type": "text"}#end,"level":{"type":"keyword"},"book_join": {"type": "join","relations": {"book": ["bookmark"]}}}}}]]></property><!--  根据子文档条件筛选父文档  --><property name="searchBookByBookMark"><![CDATA[{"query": {"has_child": {"type": "bookmark","query": {#if($keyword)"multi_match": {"query": #[keyword],"type": "most_fields","fields": ["name","directory0","directory1","directory2","directory3"]}#else"match_all": {}#end}}},"track_total_hits": true,"from":#[from],"size":#[size]}]]></property><!--  根据父文档条件筛选子文档  --><property name="searchBookMarkByBook"><![CDATA[{"query": {"parent_id": {"type": "bookmark","id": #[keyword]}},"track_total_hits": true,"size": 5000}]]></property><!--  group by --><property name="searchBook"><![CDATA[{"query": {#if($keyword)"multi_match": {"query": #[keyword],"type": "most_fields","fields": ["name","directory0","directory1","directory2","directory3"]}#else"match_all": {}#end},"track_total_hits": true,"sort": [{"_score": {"order": "desc"}}],"collapse":{"field":"name.keyword"},"from":#[from],"size":#[size]}]]></property><!--  count(*) gruop by  --><property name="countBook"><![CDATA[{"query": {#if($keyword)"multi_match": {"query": #[keyword],"type": "most_fields","fields": ["name","directory0","directory1","directory2","directory3"]}#else"match_all": {}#end},"track_total_hits": true,"size" : 0,"aggs": {"count": {"cardinality": {"field": "name.keyword"}}}}]]></property><!-- scroll --><property name="scrollQuery"><![CDATA[{"size":1000,"query": {"match_all": {}}}]]></property></properties>

3,ElasticSearchService.java

@Slf4j
@Service
public class ElasticSearchService {private String mappath = "esmapper/search.xml";private static final int fromLimit = 10000;  //设置查询上限条数public static final String INDEX_BOOKMARK = BookMark.class.getAnnotation(ESIndex.class).name();public static final String INDEX_BOOKCONTENT = BookContent.class.getAnnotation(ESIndex.class).name();/*** 检索* @param searchDto* @param clz* @param <T>* @return*/public <T> MyPage<T> search(KnowSearchDto searchDto, Class<T> clz){ClientInterface client = ElasticSearchHelper.getConfigRestClientUtil(mappath);int page = searchDto.getPage();int size = searchDto.getLimit();Map<String,Object> params = new HashMap<String,Object>();if(StringUtils.isNotBlank(searchDto.getKeyword())){params.put("keyword", searchDto.getKeyword());}params.put("from", Math.min((page-1) * size, fromLimit));params.put("size", size);Field[] fields = clz.getDeclaredFields();List<String> columns = new ArrayList<>(fields.length-1);Arrays.stream(fields).forEach(field -> {if(!"id".equals(field.getName())) columns.add(field.getName());});params.put("columns", columns);ESDatas<T> esDatas = client.searchList(clz.getAnnotation(ESIndex.class).name() +"/_search", "searchPagineDatas", params, clz);List<T> records = null == esDatas.getDatas() ? new ArrayList<>() : esDatas.getDatas();return new MyPage<T>(records, esDatas.getTotalSize(), size, page);}/*** 检索索引所有数据,每批次返回默认为5000条数据* @param index* @param clz* @param <T>* @return*/public <T> ESDatas<T> searchAll(String index, Class<T> clz){ClientInterface clientUtil = ElasticSearchHelper.getRestClientUtil();ESDatas<T> esDatas = clientUtil.searchAll(index, clz);return esDatas;}/*** 根据父文档id查询其所有子文档(根据书籍查找目录)* @param esId* @return*/public ESDatas<BookMark> searchBookMarkByBook(String esId){ClientInterface client = ElasticSearchHelper.getConfigRestClientUtil(mappath);ESDatas<BookMark> esDatas = client.searchList(INDEX_BOOKMARK+"/_search", "searchBookMarkByBook", ImmutableMap.of("keyword", esId), BookMark.class);return esDatas;}/*** (分组统计分页)* @param searchDto* @return*/@Deprecatedpublic MyPage<BookVo> searchBook(KnowSearchDto searchDto){ClientInterface client = ElasticSearchHelper.getConfigRestClientUtil(mappath);int page = searchDto.getPage();int size = searchDto.getLimit();Map<String,Object> params = new HashMap<String,Object>();if(StringUtils.isNotBlank(searchDto.getKeyword())){params.put("keyword", searchDto.getKeyword());}params.put("from", (page-1) * size);params.put("size", size);MapRestResponse restResponse = client.search(INDEX_BOOKMARK+"/_search", "countBook", params);int total = (int) restResponse.getAggregations().get("count").get("value");MyPage<BookVo> myPage = new MyPage<>(total, size, page);if(total > 0){ESDatas<BookMark> esDatas = client.searchList(INDEX_BOOKMARK +"/_search", "searchBook", params, BookMark.class);List<BookVo> bookVoList = new ArrayList<>();esDatas.getDatas().stream().forEach(bookMark -> {bookVoList.add(new BookVo(bookMark.getName(), ""));});myPage.setRecords(bookVoList);}return myPage;}public MyPage<BookMark> searchBookByBookMark(KnowSearchDto searchDto){ClientInterface clientInterface = ElasticSearchHelper.getConfigRestClientUtil(mappath);int page = searchDto.getPage();int size = searchDto.getLimit();Map<String,Object> params = new HashMap<String,Object>();if(StringUtils.isNotBlank(searchDto.getKeyword())){params.put("keyword", searchDto.getKeyword());}params.put("from", (page-1) * size);params.put("size", size);ESDatas<BookMark> esDatas = clientInterface.searchList(INDEX_BOOKMARK +"/_search", "searchBookByBookMark", params, BookMark.class);List<BookMark> records = null == esDatas.getDatas() ? new ArrayList<>() : esDatas.getDatas();return new MyPage(records, esDatas.getTotalSize(), size, page);}/*** 根据hid获取书籍篇章内容* @param hid* @return*/public BookContent getBookContentByHid(String hid){ClientInterface client = ElasticSearchHelper.getConfigRestClientUtil(mappath);return client.searchObject(INDEX_BOOKCONTENT +"/_search", "searchBookContent", ImmutableMap.of("hid", hid), BookContent.class);}}

4,entity.BookMark.java

@Slf4j
@Data
@ESIndex(name = "bookmark", type = "_doc")
public class BookMark implements Serializable {@ESIdprivate String id;private String name;private String id0;private String id1;private String id2;private String id3;private String hi0;private String hi1;private String hi2;private String hi3;private String directory0;private String directory1;private String directory2;private String directory3;@JsonProperty("book_join")private JoinSon bookJoin;@ESRoutingprivate String routingId;private Integer level;public BookMark() {}public BookMark(String name) {this.name = name;}}

5,test.ESBook.java(建索引,灌数据)

@RunWith(SpringRunner.class)
@SpringBootTest(classes = CmaiDoctorApplication.class)
@Slf4j
@ActiveProfiles("test")
public class ESBook {private String index = "bookmark";//    @Testpublic void createBookMarkIndex(){ClientInterface clientInterface = ElasticSearchHelper.getConfigRestClientUtil("esmapper/search.xml");boolean exist = clientInterface.existIndice(index);if(exist){clientInterface.dropIndice(index);}String response = clientInterface.createIndiceMapping(index, "createBookIndex");System.out.println(response);String mapping = clientInterface.getIndexMapping(index);System.out.println(mapping);}@Testpublic void insertBook() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {File dir = new File("C:\\Users\\guang\\Desktop\\中医书籍\\test3");File[] files = dir.listFiles();for (File file : files){String ext = file.getName().substring(file.getName().lastIndexOf("."));if(!".txt".equals(ext)){continue;}JSONObject jsonObject = JSON.parseObject(txt2String(file));String name = jsonObject.getString("name");JSONArray jsonArray = jsonObject.getJSONArray("bookmark");BookMark bookMark = new BookMark(name);List<BookMark> bookMarkList = new ArrayList<>();flatDeal(jsonArray, bookMarkList, bookMark, 0);log.info(JSON.toJSONString(bookMarkList));//移出书名作者,将其作为父文档BookMark bookName = bookMarkList.remove(0);JoinSon joinSon = new JoinSon();joinSon.setName("book");bookName.setBookJoin(joinSon);ClientInterface clientUtil = ElasticSearchHelper.getRestClientUtil();String response = clientUtil.addDocument(index, bookName ,"refresh");JSONObject addResponse = JSONObject.parseObject(response);
//            log.info("addResponse={}", JSON.toJSONString(addResponse));String id = addResponse.getString("_id");for (BookMark next : bookMarkList) {JoinSon js = new JoinSon();js.setName("bookmark");js.setParent(id);next.setBookJoin(js);next.setRoutingId(id);}String result = clientUtil.addDocuments(index, bookMarkList,"refresh");log.info("result ={}", result);}}/*** 将目录扁平化* @param jsonArray* @param bookMarkList* @param bookMark* @param level* @throws NoSuchMethodException* @throws IllegalAccessException* @throws InvocationTargetException*/private void flatDeal(JSONArray jsonArray, List<BookMark> bookMarkList, BookMark bookMark, Integer level) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {for (Object o : jsonArray) {JSONObject next = (JSONObject) o;setValue(bookMark, level, next);if (null != bookMark.getHi0() && bookMarkList.size() == 0) {  //如果没有作者,直接遍历到了目录,则手动生成一个假的作者bookMarkList.add(new BookMark(bookMark.getName()));}bookMarkList.add(MyUtils.CloneObj(bookMark));JSONArray childs = next.getJSONArray("bookmarkChildren");if (childs != null) {flatDeal(childs, bookMarkList, bookMark, level + 1);}}}/*** 通过反射给指定对象赋值* @param bookMark* @param level* @param value* @throws NoSuchMethodException* @throws InvocationTargetException* @throws IllegalAccessException*/private void setValue(BookMark bookMark, int level, JSONObject value) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {bookMark.setLevel(level);Class clz = bookMark.getClass();Method id = clz.getMethod("setId"+level, String.class);Method hi = clz.getMethod("setHi"+level, String.class);Method directory = clz.getMethod("setDirectory"+level, String.class);id.invoke(bookMark, value.getString("id"));hi.invoke(bookMark, value.getString("hi"));directory.invoke(bookMark, value.getString("directory"));}/*** 读取文件转为字符串* @param file* @return*/private String txt2String(File file){StringBuilder result = new StringBuilder();try{BufferedReader br = new BufferedReader(new FileReader(file));String s = null;while((s = br.readLine())!=null){result.append(System.lineSeparator()+s);}br.close();}catch(Exception e){e.printStackTrace();}return result.toString();}}

5,scroll用法

@RunWith(SpringRunner.class)
@SpringBootTest(classes = CmaiDoctorApplication.class)
@Slf4j
@ActiveProfiles("test")
public class AddImgToYaocai {private String mappath = "esmapper/search.xml";@Resourceprivate FastDfsUtils fastDfsUtils;@Testpublic void testUpload(){File dir = new File("C:\\Users\\guang\\Desktop\\医药图片第一次汇总");File[] files = dir.listFiles();Map<String, String> imgMap = new HashMap<>(files.length);Arrays.stream(files).forEach(file -> imgMap.put(file.getName().substring(0, file.getName().lastIndexOf(".")), file.getAbsolutePath()));log.info("imgMap.size = {}", imgMap.size());ClientInterface client = ElasticSearchHelper.getConfigRestClientUtil(mappath);List<String > scrollIds = new ArrayList<>();ESDatas<YaoCai> response = client.searchList("yaocai/_search?scroll=1m", "scrollQuery", YaoCai.class);List<YaoCai> datas  = response.getDatas();String scrollId     = response.getScrollId();if(scrollId != null)  scrollIds.add(scrollId);if(datas != null && datas.size() > 0) {for (Iterator<YaoCai> iterator = datas.iterator(); iterator.hasNext(); ) {YaoCai yaoCai = iterator.next();String imgFile = imgMap.get(yaoCai.getName());if(!StringUtils.isEmpty(imgFile)){yaoCai.setTupian(uploadImg(imgFile));}else{iterator.remove();}}log.info("update = {}", client.updateDocuments(datas));do {response = client.searchScroll("1m", scrollId, YaoCai.class);scrollId = response.getScrollId();if(scrollId != null) scrollIds.add(scrollId);datas.clear();datas = response.getDatas();if(datas == null || datas.size() == 0){break;}else{for (Iterator<YaoCai> iterator = datas.iterator(); iterator.hasNext(); ) {YaoCai yaoCai = iterator.next();String imgFile = imgMap.get(yaoCai.getName());if(!StringUtils.isEmpty(imgFile)){yaoCai.setTupian(uploadImg(imgFile));}else{iterator.remove();}}log.info("update = {}", client.updateDocuments(datas));}} while (true);}//查询并打印存在于es服务器上的scroll上下文信息String scrolls = client.executeHttp("_nodes/stats/indices/search", ClientUtil.HTTP_GET);
//        System.out.println(scrolls);//清除scroll上下文信息,虽然说超过1分钟后,scrollid会自动失效,//但是手动删除不用的scrollid,是一个好习惯if(scrollIds.size() > 0) {scrolls = client.deleteScrolls(scrollIds);System.out.println(scrolls);}//清理完毕后查看scroll上下文信息scrolls = client.executeHttp("_nodes/stats/indices/search", ClientUtil.HTTP_GET);System.out.println(scrolls);}private String uploadImg(String fileAbsolutePath) {try{File file = new File(fileAbsolutePath);FileInputStream input = new FileInputStream(file);MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input));return fastDfsUtils.uploadImg(multipartFile);}catch (Exception e){log.error("uploadImg error . file ={}", fileAbsolutePath, e);return "";}}//    @Testpublic void updateTest(){ClientInterface client = ElasticSearchHelper.getConfigRestClientUtil(mappath);ESIndex esIndex = YaoCai.class.getAnnotation(ESIndex.class);YaoCai yaoCai = client.getDocument(esIndex.name(), esIndex.type(), "wKdpFnIBHBOuI-wQ1k3n", YaoCai.class);log.info(JSON.toJSONString(yaoCai));yaoCai.setTupian("this is tupian");log.info("update = {}", client.updateDocument("wKdpFnIBHBOuI-wQ1k3n", yaoCai));}}

Bboss Elasticsearch 简单用法(ES 7.*)相关推荐

  1. 全文搜索引擎 ES(Elasticsearch) 简单使用说明

    官网:https://www.elastic.co/cn/elasticsearch/ 官方文档:https://www.elastic.co/guide/en/elasticsearch/refer ...

  2. SpringBoot如何整合BBoss Elasticsearch呢

    大家一定很熟悉mybatis了,它是一个持久层框架,可以通过简单的XML或注解来配置,映射为数据库中的数据.我们通常是在xml文件中写sql,来操作数据库中的数据.而接下来要讲的bboss elast ...

  3. 2021年大数据ELK(二):Elasticsearch简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.Elasticsearch简介 1.介绍 2.创始人 二.E ...

  4. ElasticSearch简单使用

    文章目录 一.启动ElasticSearch 二.使用ik分词器 1.安装ik 2.重启es,查看加载插件 3.两种分词算法 4.自定义ik关键词 二.ES常用操作 1.创建带有结构的索引 2.增加数 ...

  5. Elasticsearch SQL用法详解

    原创 数据库开发技术 作者:小米运维 时间:2018-12-13 17:10:44  6260  0 本文详细介绍了不同版本中Elasticsearch SQL的使用方法,总结了实际中常用的方法和操作 ...

  6. ElasticSearch - SpringBoot集成ES

    文章目录 ElasticSearch - SpringBoot集成ES 1.整体设计思路(仿NBA中国官网) 2.项目搭建 3.ES API的基本使用 3.1 新增球员信息 3.2 查看球员信息 3. ...

  7. 反编译工具jad简单用法

    反编译工具jad简单用法 下载地址: [url]http://58.251.57.206/down1?cid=B99584EFA6154A13E5C0B273C3876BD4CC8CE672& ...

  8. QCustomPlot的简单用法总结

    QCustomPlot的简单用法总结 第一部分:QCustomPlot的下载与安装 第二部分:QCustomPlot在VS2013+QT下的使用 QCustomPlot的简单用法总结    写在前面, ...

  9. python matplotlib 简单用法

    python matplotlib 简单用法 具体内容请参考官网 代码 import matplotlib.pyplot as plt import numpy as np # 支持中文 plt.rc ...

最新文章

  1. 不要做浮躁的嵌入式系统工程师
  2. 通俗讲解操作系统的中断
  3. 回归模型-线性回归算法
  4. 热力学第二定律中的悖论 | 集智百科
  5. Node.js中文件上传与multer模块的应用
  6. content-type的作用
  7. 服务机器人平台和后台
  8. 关于css的一些特别用法
  9. 高仿真的类-业务逻辑注入接口
  10. 音视频技术开发周刊 60期
  11. thinkPhp 3.1.3的验证码无法显示的问题
  12. Mongodb~连接串的整理
  13. 51单片机实现简单计算器
  14. C语言课程设计超级万年历
  15. 商家如何制作外卖小程序并且对接同城外卖配送平台?
  16. 透明OLED显示器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. 现场总线与计算机网络的最大区别,现场总线与局域网的区别是什么
  18. 武汉理工大学数据库综合实验——教学管理信息系统--本科专业培养计划
  19. python之路金角大王_Python 之路03 - Python基础3
  20. 同程艺龙通过港交所上市聆讯 要冲刺小程序第一股

热门文章

  1. java 获取最近12个月(包含当月)
  2. 基于OpenAPI Specification自动生成Android客户端代码
  3. window10怎么卸载php,window10怎么卸载软件以及清空插件
  4. 各大CMS采集资源站合集
  5. 蘑菇街的开源IM:TeamTalk
  6. 金融大数据信用评分模型解析
  7. 网络游戏网络同步方案的选择
  8. python求两数最大公因数_使用辗转相除法求两个数的最大公因数(python实现)
  9. 【Python】面试官:元组列表都分不清,回去等通知pa
  10. 三角形(triangle)