技术架构
- spring boot 2.6.3
- elasticsearch6.6.2
- jdk1.8
依赖pom
<properties> <java.version>1.8</java.version> <elasticsearch.version>6.4.3</elasticsearch.version> </properties> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <version>1.18.4</version> </dependency> <dependency> <groupid>com.alibaba</groupid> <artifactid>fastjson</artifactid> <version>1.2.59</version> </dependency> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <scope>test</scope> </dependency> <dependency> <groupid>org.elasticsearch</groupid> <artifactid>elasticsearch</artifactid> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupid>org.elasticsearch.client</groupid> <artifactid>transport</artifactid> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupid>org.elasticsearch.client</groupid> <artifactid>elasticsearch-rest-high-level-client</artifactid> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupid>org.elasticsearch.plugin</groupid> <artifactid>transport-netty4-client</artifactid> <version>${elasticsearch.version}</version> </dependency>
application.yml配置
elasticsearch: cluster-name: test-es # 多台机器用,分割 cluster-nodes: 192.168.116.200:9300
esconfig 配置类
package com.example.link.config; import lombok.extern.slf4j.slf4j; import org.elasticsearch.client.transport.transportclient; import org.elasticsearch.common.settings.settings; import org.elasticsearch.common.transport.transportaddress; import org.elasticsearch.transport.client.prebuilttransportclient; import org.springframework.beans.factory.annotation.value; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.util.stringutils; import java.net.inetaddress; /** * @author lanx * @date 2022/3/13 */ @configuration @slf4j public class esconfig { private static final string cluster_nodes_split_symbol = ","; private static final string host_port_split_symbol = ":"; @value("${elasticsearch.cluster-name}") string clustername; @value("${elasticsearch.cluster-nodes}") string clusternodes; @bean public transportclient gettransportclient() { log.info("elasticsearch init."); if (stringutils.isempty(clustername)) { throw new runtimeexception("elasticsearch.cluster-name is empty."); } if (stringutils.isempty(clusternodes)) { throw new runtimeexception("elasticsearch.cluster-nodes is empty."); } try { settings settings = settings.builder().put("cluster.name", clustername.trim()) .put("client.transport.sniff", true).build(); transportclient transportclient = new prebuilttransportclient(settings); string[] clusternodearray = clusternodes.trim().split(cluster_nodes_split_symbol); for (string clusternode : clusternodearray) { string[] clusternodeinfoarray = clusternode.trim().split(host_port_split_symbol); transportaddress transportaddress = new transportaddress(inetaddress.getbyname(clusternodeinfoarray[0]), integer.parseint(clusternodeinfoarray[1])); transportclient.addtransportaddress(transportaddress); } log.info("elasticsearch init success."); return transportclient; } catch (exception e) { throw new runtimeexception("elasticsearch init fail."); } } }
linkwebaapplicationtests 测试类
package com.example.link; import com.alibaba.fastjson.json; import com.example.link.domain.student; import lombok.extern.slf4j.slf4j; import org.elasticsearch.action.bulk.bulkrequestbuilder; import org.elasticsearch.action.bulk.bulkresponse; import org.elasticsearch.action.delete.deleteresponse; import org.elasticsearch.action.index.indexresponse; import org.elasticsearch.action.search.searchrequestbuilder; import org.elasticsearch.action.search.searchresponse; import org.elasticsearch.action.search.searchtype; import org.elasticsearch.action.update.updaterequest; import org.elasticsearch.action.update.updateresponse; import org.elasticsearch.client.transport.transportclient; import org.elasticsearch.common.xcontent.xcontenttype; import org.elasticsearch.index.query.boolquerybuilder; import org.elasticsearch.index.query.querybuilders; import org.elasticsearch.index.query.functionscore.functionscorequerybuilder; import org.elasticsearch.index.reindex.bulkbyscrollresponse; import org.elasticsearch.index.reindex.deletebyqueryaction; import org.elasticsearch.search.searchhit; import org.elasticsearch.search.searchhits; import org.junit.jupiter.api.test; import org.junit.runner.runwith; import org.springframework.beans.factory.annotation.autowired; import org.springframework.boot.test.context.springboottest; import org.springframework.test.context.junit4.springrunner; import java.util.arraylist; import java.util.list; import java.util.map; @runwith(springrunner.class) @springboottest @slf4j class linkwebaapplicationtests { private student student; @autowired private transportclient transportclient; /** * es 插入数据,指定id */ @test void test() { student = new student(); student.setname("test2"); student.setage(20); indexresponse response = transportclient.prepareindex("school","student","1").setsource(json.tojsonstring(student), xcontenttype.json) .get(); log.info("status:{}",response.status().getstatus()); } /** * es 插入数据,不指定id */ @test void test2() { student = new student(); student.setname("test2"); student.setage(20); indexresponse response = transportclient.prepareindex("school","student").setsource(json.tojsonstring(student), xcontenttype.json) .get(); log.info("status:{}",response.status().getstatus()); } /** * es p批量插入数据,不指定id */ @test void test3() { //建立批量提交类 bulkrequestbuilder bulkrequest =transportclient.preparebulk(); for (int i = 0; i<= 10 ;i++){ student = new student(); student.setname("lx"+i); student.setage(i); bulkrequest.add(transportclient.prepareindex("school","student").setsource(json.tojsonstring(student), xcontenttype.json)); } bulkresponse bulkresponse=bulkrequest.execute().actionget(); //提交过程是否产生错误 if(bulkresponse.hasfailures()){ log.info("buildfailuremessage:{}",bulkresponse.buildfailuremessage()); }else { log.info("bulkrequest success !"); } } /* * 查询分页数据 */ @test void test4(){ searchrequestbuilder builder = transportclient.preparesearch("school"); builder.settypes("student"); builder.setsearchtype(searchtype.dfs_query_then_fetch); builder.setfrom(0); builder.setsize(20); //explain为true表示根据数据相关度排序,和关键字匹配最高的排在前面 builder.setexplain(true); boolquerybuilder querybuilder = querybuilders.boolquery(); // 搜索 name 字段包含test2的数据 querybuilder.must(querybuilders.matchquery("name", "lx0")); querybuilder.must(querybuilders.matchquery("age", "0")); //多个字段查询一个文本 querybuilder.must(querybuilders.multimatchquery("0", "name","age")); // 多条件查询 functionscore functionscorequerybuilder query = querybuilders.functionscorequery(querybuilder); builder.setquery(query); searchresponse response = builder.execute().actionget(); searchhits hits = response.gethits(); list<map<string,object>> result = new arraylist<map<string, object>>(); for (searchhit hit:hits){ result.add(hit.getsourceasmap()); } log.info("result list : {}",json.tojsonstring(result)); } /** * 更新数据 * @throws exception */ @test public void test5() throws exception{ student = new student(); student.setname("lx"); student.setage(30); updaterequest updaterequest = new updaterequest(); updaterequest doc = updaterequest .index("school") .type("student") .id("1") .doc(json.tojsonstring(student), xcontenttype.json); updateresponse response = transportclient.update(doc).get(); log.info("status : {}",response.status().tostring()); } /** * 根据id删除数据 */ @test public void test6(){ deleteresponse response = transportclient.preparedelete("school", "student", "1").get(); log.info("status : {}",response.status()); } /** * 根据条件删除数据 */ @test public void test8() { bulkbyscrollresponse response = deletebyqueryaction.instance .newrequestbuilder(transportclient) .filter(querybuilders.matchquery("name", "test2")) .source("school") //index .get(); log.info("status : {}",response.getdeleted()); } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论