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
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇