bboss是一套基于query dsl语法操作和访问分布式搜索引擎elasticsearch的o/r mapping高性能开发库,底层基于es restful api。基于bboss elasticsearch,可以快速编写出访问和操作elasticsearch的程序代码,简单、高效、可靠、安全。
1.导依赖
<dependency> <groupId>com.bbossgroups.plugins</groupId> <artifactId>bboss-elasticsearch-rest-jdbc</artifactId> <version>6.1.8</version> </dependency> <dependency> <groupId>com.bbossgroups.plugins</groupId> <artifactId>bboss-elasticsearch-spring-boot-starter</artifactId> <version>6.1.8</version> </dependency>2.配置
##ES集群配置,支持x-pack和searchguard #spring.elasticsearch.bboss.elasticUser=elastic #spring.elasticsearch.bboss.elasticPassword=changeme spring.elasticsearch.bboss.elasticsearch.rest.hostNames=192.168.57.128:9200 #spring.elasticsearch.bboss.elasticsearch.rest.hostNames=10.180.211.27:9280,10.180.211.27:9281,10.180.211.27:9282 ##https配置,添加https://协议头 #spring.elasticsearch.bboss.default.elasticsearch.rest.hostNames=https://10.180.211.27:9280,https://10.180.211.27:9281,https://10.180.211.27:9282 spring.elasticsearch.bboss.elasticsearch.dateFormat=yyyy.MM.dd spring.elasticsearch.bboss.elasticsearch.timeZone=Asia/Shanghai spring.elasticsearch.bboss.elasticsearch.ttl=2d #在控制台输出脚本调试开关showTemplate,false关闭,true打开,同时log4j至少是info级别 spring.elasticsearch.bboss.elasticsearch.showTemplate=true spring.elasticsearch.bboss.elasticsearch.discoverHost=false # dsl配置文件热加载扫描时间间隔,毫秒为单位,默认5秒扫描一次,<= 0时关闭扫描机制 spring.elasticsearch.bboss.dslfile.refreshInterval = -1 ##es client http连接池配置 spring.elasticsearch.bboss.http.timeoutConnection = 50000 spring.elasticsearch.bboss.http.timeoutSocket = 50000 spring.elasticsearch.bboss.http.connectionRequestTimeout=50000 spring.elasticsearch.bboss.http.retryTime = 1 spring.elasticsearch.bboss.http.maxLineLength = -1 spring.elasticsearch.bboss.http.maxHeaderCount = 200 spring.elasticsearch.bboss.http.maxTotal = 400 spring.elasticsearch.bboss.http.defaultMaxPerRoute = 200 spring.elasticsearch.bboss.http.soReuseAddress = false spring.elasticsearch.bboss.http.soKeepAlive = false spring.elasticsearch.bboss.http.timeToLive = 3600000 spring.elasticsearch.bboss.http.keepAlive = 3600000 spring.elasticsearch.bboss.http.keystore = spring.elasticsearch.bboss.http.keyPassword = # ssl 主机名称校验,是否采用default配置, # 如果指定为default,就采用DefaultHostnameVerifier,否则采用 SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER spring.elasticsearch.bboss.http.hostnameVerifier =4.开始使用api(这里我使用的测试类)
由于操作api需要创建客户端实例,这里有两种方式:
@Autowired private BBossESStarter bbossESStarter; //这个是通过dsl脚本配置来创建(在需要自定义mapping时需要) ClientInterface configClientUtil = bbossESStarter.getConfigRestClient(mappath); //这个则相反,不需要dsl ClientInterface clientUtil = bbossESStarter.getRestClient();4.1 创建索引(创建索引有两种方式,一种是普通的创建,即不指定mapping,对字段使用默认的数据类型。而另一种则是自定义mapping,每个字段的数据类型由我们自己指定):
4.1.1 普通创建:
@SpringBootTest class EsBbossTest { @Autowired private BBossESStarter bbossESStarter; /** *创建索引 */ @Test public void createIndex(){ String result = bbossESStarter.getRestClient().createIndiceMapping("blog",""); System.out.println(result); } }以下是控制台打印结果:
2020-07-04 17:30:42.913 INFO 7276 --- [ main] o.f.e.client.ElasticSearchRestClient : ElasticSearch http request action:blog,request body: {"acknowledged":true,"shards_acknowledged":true,"index":"blog"}4.1.2 自定义mapping:
先创建一个dsl脚本文件,在里面自定义mapping规则:
<propertys> <property name="create51jobIndex">//每个property中的name属性表示当前mapping的命名,一个xml文件里可设置多个dsl脚本 <![CDATA[{ "settings": { "number_of_shards": 1, "number_of_replicas": 1, "index.refresh_interval": "5s" }, "mappings": { "properties": { "job":{ "type":"text" }, "company": { "type": "text" }, "place": { "type": "text" }, "salar": { "type": "text" }, "data": { "type": "date", "format":"yyyy-MM-dd HH:mm:ss.SSS||yyyy-MM-dd'T'HH:mm:ss.SSS||yyyy-MM-dd HH:mm:ss||epoch_millis" } } } }]]> </property> </propertys>然后创建客户端,并且调用创建索引api:
@SpringBootTest class EsBbossTest { @Autowired private BBossESStarter bbossESStarter; /** *创建索引 */ @Test public void createIndex(){ ClientInterface clientUtil = bbossESStarter.getConfigRestClient("esmapper/job.xml"); String result = clientUtil.createIndiceMapping("51job","create51jobIndex"); System.out.println(result); } }以下是控制台打印结果:
2020-07-04 17:10:35.903 INFO 6172 --- [ main] o.f.e.client.ElasticSearchRestClient : ElasticSearch http request action:51job,request body: { "settings": { "number_of_shards": 1, "number_of_replicas": 1, "index.refresh_interval": "5s" }, "mappings": { "properties": { "job":{ "type":"text" }, "company": { "type": "text" }, "place": { "type": "text" }, "salar": { "type": "text" }, "data": { "type": "date", "format":"yyyy-MM-dd HH:mm:ss.SSS||yyyy-MM-dd'T'HH:mm:ss.SSS||yyyy-MM-dd HH:mm:ss||epoch_millis" } } } } {"acknowledged":true,"shards_acknowledged":true,"index":"51job"} 2020-07-04 17:10:36.113 INFO 6172 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' 2020-07-04 17:10:37.110 INFO 6172 --- [ Thread-153] o.f.elasticsearch.ElasticSearch : ElasticSearch client stopping Process finished with exit code 04.2 删除索引
@SpringBootTest class EsBbossTest { @Autowired private BBossESStarter bbossESStarter; /** *删除索引 */ @Test public void dropIndex(){ String result = bbossESStarter.getRestClient().dropIndice("blog"); System.out.println(result); } }打印结果:
2020-07-04 17:37:12.133 INFO 9384 --- [ main] o.f.e.client.ElasticSearchRestClient : ElasticSearch http request action:blog?pretty { "acknowledged" : true }4.3 判断索引是否存在
@SpringBootTest class EsBbossTest { @Autowired private BBossESStarter bbossESStarter; /** *判断索引是否存在 */ @Test public void indexIsExists(){ boolean exist = bbossESStarter.getRestClient().existIndice("51job"); System.out.println(exist); } }打印结果:
2020-07-04 17:40:03.011 INFO 14156 --- [ main] o.f.e.client.ElasticSearchRestClient : ElasticSearch http request action:51job true4.4 判断索引类型是否存在
@SpringBootTest class EsBbossTest { @Autowired private BBossESStarter bbossESStarter; /** *判断索引类型是否存在 */ @Test public void typeIsExists(){ boolean exist = bbossESStarter.getRestClient().existIndiceType("51job","_doc"); System.out.println(exist); } }打印结果:
2020-07-04 17:42:24.657 INFO 9168 --- [ main] o.f.e.client.ElasticSearchRestClient : ElasticSearch http request action:51job/_mapping/_doc true4.5 添加单个文档
@SpringBootTest class EsBbossTest { @Autowired private BBossESStarter bbossESStarter; /** *指定索引添加单个文档 */ @Test public void addDocument(){ Qcpage qcpage=new Qcpage(); qcpage.setCompany("安软科技股份有限公司").setData("2020-06-03 21:18:12").setJob("Java开发工程师").setPlace("深圳南山").setSalar("13000/月"); String result = bbossESStarter.getRestClient().addDocument("51job",qcpage); System.out.println(result); } }打印结果:
2020-07-04 17:53:00.735 INFO 13100 --- [ main] o.f.e.client.ElasticSearchRestClient : ElasticSearch http request action:51job/_doc,request body: {"id":null,"job":"java开发工程师","company":"安软科技股份有限公司","place":"深圳南山","salar":"13000/月","data":"2020-06-03 21:18:12"} {"_index":"51job","_type":"_doc","_id":"YZI-GXMBBreT5daWT3ND","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":2,"_primary_term":1}4.6 批量添加文档
@SpringBootTest class EsBbossTest { @Autowired private BBossESStarter bbossESStarter; @Autowired QcpageService qcpageService; /** *批量添加文档(此处从mysql取出来1300条数据测试) */ @Test public void batchAddDocument(){ List<Qcpage> list=qcpageService.list(); long startTime = System.currentTimeMillis(); String result = bbossESStarter.getRestClient().addDocuments("51job",list); long endTime = System.currentTimeMillis(); System.out.println("添加"+list.size()+"条数据耗时:" + (endTime - startTime)/1000 + "s"); System.out.println(result); } }打印结果(耗时0.3s):
添加1341条数据耗时:333ms4.7 查询单个文档
@SpringBootTest class EsBbossTest { @Autowired private BBossESStarter bbossESStarter; /** *查询一个文档 */ @Test public void getDocument(){ String result = bbossESStarter.getRestClient().getDocument("51job","7pJsGXMBBreT5daW4X1w"); System.out.println(result); } }打印结果:
{"_index":"51job","_type":"_doc","_id":"7pJsGXMBBreT5daW4X1w","_version":1,"_seq_no":18,"_primary_term":1,"found":true,"_source":{"id":19,"job":"JAVA开发工程师","company":"木炎(深圳)区块链技术有限公司","place":"深圳-福田区","salar":"1-1.5万/月","data":"12-13"}}还有很多查询方法,也可以写dsl自定义条件查询,内容多就不写啦!!!!