package com.test;
import com.imooc.Application;
import com.imooc.es.pojo.Stu;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
import org.springframework.data.elasticsearch.core.query.*;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class ESTest {
@Autowired
private ElasticsearchTemplate esTemplate;
/**
* 不建议使用ElasticsearchTemplate对索引进行管理(创建,更新映射,删除索引)
* 索引就像是数据库或者是数据库中的表,我们平时不会通过java代码频繁的去创建修改删除数据库或表
* 我们只会针对数据做crud的操作
* 在es中也是同理,我们尽量使用ElasticsearchTemplate 对文档数据做CRUD操作
*/
@Test //创建索引并插入文档
public void createIndexStu() {
Stu stu = new Stu();
stu.setStuId(1001L);
stu.setName("为道日损");
stu.setAge(18);
IndexQuery indexQuery = new IndexQueryBuilder().withObject(stu).build();
esTemplate.index(indexQuery);
}
@Test //新增文档
public void createIndexStu0() {
Stu stu = new Stu();
stu.setStuId(1002L);
stu.setName("为道日损11");
stu.setAge(20);
stu.setMoney(18.2f);
stu.setSign("I am super man");
stu.setDescription("hey man,I belive I would to be a superman");
IndexQuery indexQuery = new IndexQueryBuilder().withObject(stu).build();
esTemplate.index(indexQuery);
}
@Test //删除索引
public void deleteIndexStu() {
esTemplate.deleteIndex(Stu.class);
}
//-------------------------------------------分割线-----------------------------------------
@Test //更新文档
public void updateStuDoc(){
Map<String ,Object> sourcemap = new HashMap<>();
sourcemap.put("sign", "I am not super man");
sourcemap.put("money", 22.3f);
sourcemap.put("age",44);
IndexRequest indexRequest = new IndexRequest();
indexRequest.source(sourcemap);
UpdateQuery updateQuery = new UpdateQueryBuilder()
.withClass(Stu.class)
.withId("1002")
.withIndexRequest(indexRequest)
.build();
esTemplate.update(updateQuery);
}
@Test //根据ID查询文档
public void getIndexStuDoc() {
GetQuery getQuery = new GetQuery();
getQuery.setId("1002");
Stu stu = esTemplate.queryForObject(getQuery, Stu.class);
System.out.print(stu);
}
@Test //删除文档
public void deleteStuDoc(){
esTemplate.delete(Stu.class,"1002");
}
@Test //查询文档
public void searchStuDoc() {
Pageable pageable = PageRequest.of(0, 3);
SearchQuery query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchQuery("name","为"))
.withPageable(pageable)
.build();
AggregatedPage<Stu> pageStu = esTemplate.queryForPage(query, Stu.class);
System.out.println("检索后的总分页数目为:"+pageStu.getTotalPages());
List<Stu> stuList = pageStu.getContent();
for (Stu s : stuList) {
System.out.println(s);
}
}
@Test //高亮显示
public void highlightStuDoc() {
String preTag = "<font color='red'>";
String postTag = "</font>";
Pageable pageable = PageRequest.of(0, 3);
//排序条件
SortBuilder sortBuilder = new FieldSortBuilder("money").order(SortOrder.ASC);
SearchQuery query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchQuery("name","为"))
.withPageable(pageable)
.withSort(sortBuilder)
.withHighlightFields(new HighlightBuilder.Field("name")
.preTags(preTag)
.postTags(postTag))
.build();
AggregatedPage<Stu> pageStu = esTemplate.queryForPage(query, Stu.class, new SearchResultMapper() {
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {
SearchHits his = searchResponse.getHits();
List<Stu> stuList = new ArrayList<>();
for (SearchHit h : his) {
HighlightField highlightField = h.getHighlightFields().get("name");
String name = highlightField.getFragments()[0].toString();
Object stuId = h.getSourceAsMap().get("stuId");
Integer age = (Integer) h.getSourceAsMap().get("age");
Stu stuHL = new Stu();
stuHL.setName(name);
stuHL.setAge(age);
stuHL.setStuId(Long.valueOf(stuId.toString()));
stuList.add(stuHL);
}
if (stuList.size()>0){
return new AggregatedPageImpl<>((List<T>)stuList);
}
return null;
}
});
System.out.println("检索后的总分页数目为:"+pageStu.getTotalPages());
List<Stu> stuList = pageStu.getContent();
for (Stu s : stuList) {
System.out.println(s);
}
}
}
最后修改于 2020-04-13 17:33:06
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

