1、创建SpringBoot工程。
spring boot版本为2.2.6, 增加spring-boot-starter-data-elasticsearch
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>sp-esearch</artifactId> <version>0.0.1-SNAPSHOT</version> <name>sp-esearch</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> <!--<version>2.2.2.RELAESE</version>--> </dependency> </dependencies> </project>
2、增加配置
spring: data: elasticsearch: cluster-name: elasticsearch cluster-nodes: 127.0.0.1:9300
3、使用单元测试创建索引
@SpringBootTest class SpEsearchApplicationTests { @Test void contextLoads() { } }
创建Student类
@Document(indexName = "stu", type = "_doc") public class Student { @Id private Long stuId; @Field(store = true) private String name; @Field(store = true) private Integer age; public Long getStuId() { return stuId; } public void setStuId(Long stuId) { this.stuId = stuId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
创建索引
public class ESTest extends SpEsearchApplicationTests { @Autowired private ElasticsearchTemplate esTemplate; //创建索引 @Test public void createIndex(){ Student stu = new Student(); stu.setStuId(1000L); stu.setName("Nick"); stu.setAge(20); IndexQuery indexQuery = new IndexQueryBuilder().withObject(stu).build(); esTemplate.index(indexQuery); } }
执行单元测试方法,结果显示索引已经创建成功
数据浏览
4、删除索引
@Test public void deleteIndex(){ esTemplate.deleteIndex(Student.class); }
注意: 不建议使用ElasticsearchTemplate对索引进行管理(创建索引,更新映射,删除索引)。
索引就像是数据库或者数据库中的表,我们平时不会通过Java代码频繁的去创建修改删除数据库或者表,之后针对数据做CRUD操作,在es中也是同理,
5、更新文档数据。
Id为1000这条数据
@Test public void updateStuDoc(){ Map<String,Object> source = new HashMap<>(); source.put("sign","I am not a english teacher"); source.put("money",88.8f); source.put("age","100"); IndexRequest indexRequest = new IndexRequest(); indexRequest.source(source); UpdateQuery query = new UpdateQueryBuilder().withClass(Student.class) .withId("1000") .withIndexRequest(indexRequest) .build(); esTemplate.update(query); }
6、查询文档数据
@Test public void getStuInfo(){ GetQuery getQuery = new GetQuery(); getQuery.setId("1000"); Student student = esTemplate.queryForObject(getQuery, Student.class); System.out.println(student); }
返回结果
Student{stuId=1000, name='Nick 2', age=100, money=88.8, sign='I am not a english teacher', description='I am a english teacher'}
7、删除文档数据
@Test public void deleteStuDoc(){ esTemplate.delete(Student.class,"1000"); }
8、文档分页查询
1) 创建5条数据
@Test public void createIndex(){ for(int i = 0 ; i < 5; i++){ Student stu = new Student(); stu.setStuId(1000L + i); stu.setName("Nick" + i); stu.setAge(20 + i); stu.setMoney(18.9f + i); stu.setSign("I am a teacher"); stu.setDescription("I am a english teacher " + i); IndexQuery indexQuery = new IndexQueryBuilder().withObject(stu).build(); esTemplate.index(indexQuery); } }
2) 分页查询
@Test public void searchStuDoc(){ Pageable pageable = PageRequest.of(0,10); SearchQuery query = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("description","a teacher")) .withPageable(pageable).build(); AggregatedPage<Student> pageStu = esTemplate.queryForPage(query,Student.class); System.out.println("总分页数:" + pageStu.getTotalPages()); List<Student> stuList = pageStu.getContent(); for(Student student : stuList){ System.out.println(student); } }
返回结果如下:
总分页数:1 Student{stuId=1000, name='Nick0', age=20, money=18.9, sign='I am a teacher', description='I am a english teacher 0'} Student{stuId=1001, name='Nick1', age=21, money=19.9, sign='I am a teacher', description='I am a english teacher 1'} Student{stuId=1002, name='Nick2', age=22, money=20.9, sign='I am a teacher', description='I am a english teacher 2'} Student{stuId=1003, name='Nick3', age=23, money=21.9, sign='I am a teacher', description='I am a english teacher 3'} Student{stuId=1004, name='Nick4', age=24, money=22.9, sign='I am a teacher', description='I am a english teacher 4'}
8、文档高亮查询
@Test public void highlightStuDoc(){ String preTag = "<font color='red'>"; String postTag = "</font>"; Pageable pageable = PageRequest.of(0,2); SearchQuery query = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("description","a teacher")) .withHighlightFields(new HighlightBuilder.Field("description").preTags(preTag).postTags(postTag)) .withPageable(pageable).build(); AggregatedPage<Student> pageStu = esTemplate.queryForPage(query, Student.class, new SearchResultMapper() { @Override public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) { List<Student> stuHighlight = new ArrayList<>(); SearchHits hits = searchResponse.getHits(); for(SearchHit h: hits){ HighlightField highlightField = h.getHighlightFields().get("description"); Integer stuId = (Integer)h.getSourceAsMap().get("stuId"); String name = (String)h.getSourceAsMap().get("name"); Integer age = (Integer)h.getSourceAsMap().get("age"); String sign = (String)h.getSourceAsMap().get("sign"); Object money = h.getSourceAsMap().get("money"); //高亮数据 String description = highlightField.getFragments()[0].toString(); Student studentHL = new Student(); studentHL.setDescription(description); studentHL.setStuId(Long.parseLong(stuId.toString())); studentHL.setName(name); studentHL.setAge(age); studentHL.setSign(sign); studentHL.setMoney(Float.parseFloat(money.toString())); stuHighlight.add(studentHL); } if(!stuHighlight.isEmpty()){ return new AggregatedPageImpl<>((List<T>) stuHighlight); } return null; } @Override public <T> T mapSearchHit(SearchHit searchHit, Class<T> aClass) { return null; } }); System.out.println("总分页数:" + pageStu.getTotalPages()); List<Student> stuList = pageStu.getContent(); for(Student student : stuList){ System.out.println(student); } }
返回结果如下
总分页数:1 Student{stuId=1000, name='Nick0', age=20, money=18.9, sign='I am a teacher', description='I am <font color='red'>a</font> english <font color='red'>teacher</font> 0'} Student{stuId=1001, name='Nick1', age=21, money=19.9, sign='I am a teacher', description='I am <font color='red'>a</font> english <font color='red'>teacher</font> 1'}
9、排序
查询结果以money进行降序
@Test public void sortStuDoc(){ String preTag = "<font color='red'>"; String postTag = "</font>"; Pageable pageable = PageRequest.of(0,10); //查询结果以money进行排序 SortBuilder sortBuilder = new FieldSortBuilder("money") .order(SortOrder.DESC); SearchQuery query = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("description","a teacher")) .withHighlightFields(new HighlightBuilder.Field("description").preTags(preTag).postTags(postTag)) .withSort(sortBuilder) .withPageable(pageable).build(); AggregatedPage<Student> pageStu = esTemplate.queryForPage(query, Student.class, new SearchResultMapper() { @Override public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) { List<Student> stuHighlight = new ArrayList<>(); SearchHits hits = searchResponse.getHits(); for(SearchHit h: hits){ HighlightField highlightField = h.getHighlightFields().get("description"); Integer stuId = (Integer)h.getSourceAsMap().get("stuId"); String name = (String)h.getSourceAsMap().get("name"); Integer age = (Integer)h.getSourceAsMap().get("age"); String sign = (String)h.getSourceAsMap().get("sign"); Object money = h.getSourceAsMap().get("money"); //高亮数据 String description = highlightField.getFragments()[0].toString(); Student studentHL = new Student(); studentHL.setDescription(description); studentHL.setStuId(Long.parseLong(stuId.toString())); studentHL.setName(name); studentHL.setAge(age); studentHL.setSign(sign); studentHL.setMoney(Float.parseFloat(money.toString())); stuHighlight.add(studentHL); } if(!stuHighlight.isEmpty()){ return new AggregatedPageImpl<>((List<T>) stuHighlight); } return null; } @Override public <T> T mapSearchHit(SearchHit searchHit, Class<T> aClass) { return null; } }); System.out.println("总分页数:" + pageStu.getTotalPages()); List<Student> stuList = pageStu.getContent(); for(Student student : stuList){ System.out.println(student); } }
返回如下:
总分页数:1 Student{stuId=1004, name='Nick4', age=24, money=22.9, sign='I am a teacher', description='I am <font color='red'>a</font> english <font color='red'>teacher</font> 4'} Student{stuId=1003, name='Nick3', age=23, money=21.9, sign='I am a teacher', description='I am <font color='red'>a</font> english <font color='red'>teacher</font> 3'} Student{stuId=1002, name='Nick2', age=22, money=20.9, sign='I am a teacher', description='I am <font color='red'>a</font> english <font color='red'>teacher</font> 2'} Student{stuId=1001, name='Nick1', age=21, money=19.9, sign='I am a teacher', description='I am <font color='red'>a</font> english <font color='red'>teacher</font> 1'} Student{stuId=1000, name='Nick0', age=20, money=18.9, sign='I am a teacher', description='I am <font color='red'>a</font> english <font color='red'>teacher</font> 0'}
对多个字段进行排序。如对money和age进行排序