ElasticSearch


一、ElasticSearch是什么?

全文检索,创建Document文档类,包括:创建索引,创建映射,封装数据。

二、代码实现

1.引入依赖

代码如下(示例):

	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>

2.创建EmpDoc文档

代码如下(示例):

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

/**
 * 创建索引库、映射(指定类型)、封装数据
 */
@Document(indexName = "pethome",type = "emp")
public class EmpDoc {

    @Id
    private Long id;

    private Integer age;

    @Field(type = FieldType.Keyword) // 不分词
    private String userName;

    @Field(type = FieldType.Text,analyzer = "ik_smart",searchAnalyzer = "ik_smart")
    private String intro;

    public EmpDoc(Long id, Integer age, String userName, String intro) {
        this.id = id;
        this.age = age;
        this.userName = userName;
        this.intro = intro;
    }
    public EmpDoc() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getIntro() {
        return intro;
    }

    public void setIntro(String intro) {
        this.intro = intro;
    }

    @Override
    public String toString() {
        return "EmpDoc{" +
                "id=" + id +
                ", age=" + age +
                ", userName='" + userName + '\'' +
                ", intro='" + intro + '\'' +
                '}';
    }
}

3.继承ElasticsearchRepository

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface EmpElasticsearchRepository extends ElasticsearchRepository<EmpDoc,Long> {
}

4.业务实现

import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.sort.FieldSortBuilder;
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.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Repository;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = EsApp.class)
@Repository
public class EsTest {

    @Autowired
    ElasticsearchTemplate elasticsearchTemplate;

    //通过接口的方式引用代理实现类
    @Autowired
    EmpElasticsearchRepository empElasticsearchRepository; // 由于我们要CRUD,但是本身没有crud方法

    @Test
    public void testCreateIndex() {
        elasticsearchTemplate.createIndex(EmpDoc.class); // 创建索引库
        elasticsearchTemplate.putMapping(EmpDoc.class); // 创建映射
    }

    /**
     * 新增或修改
     */
    @Test
    public void testSave(){
        //empElasticsearchRepository.save(new EmpDoc(4L,12,"小叮当4","今天是个日子"));
        empElasticsearchRepository.saveAll(initDoc());
    }
    /**
     * 删除
     */
    @Test
    public void testDelete(){
        empElasticsearchRepository.deleteById(1L);
    }

    /**
     * 查询
     */
    @Test
    public void testGet(){
        //System.out.println(empElasticsearchRepository.findById(2L).get());
        Iterable<EmpDoc> all = empElasticsearchRepository.findAll();
        all.forEach((EmpDoc)->{
            System.out.println(EmpDoc);
        });
    }



    public List<EmpDoc> initDoc(){
        ArrayList<EmpDoc> docs = new ArrayList<>(50);
        for (int i=0;i<50;i++){
            if(i%2==0){
                docs.add(new EmpDoc(Long.valueOf(i), 12+i,"小叮当","今天是个日子"+i));
            }else{
                docs.add(new EmpDoc(Long.valueOf(i), 12+i,"大叮当","今天是个日子"+i));
            }
        }
        return docs;
    }
    /**
     * 高级查询
     *          分页:第一页,5条一页
     *          username="小叮当"
     *          intro=“好日子”
     *          1<age<20
     *          倒序
     */
    @Test
    public void testSearch(){
        // 别问
        NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
        // 分页
        builder.withPageable(PageRequest.of(0,5));// 0-->从第一页
        // 排序 SortMode 有min、max。avg
        builder.withSort(new FieldSortBuilder("age").order(SortOrder.DESC));

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();// 源码return new BoolQueryBuilder()
        // must
        boolQueryBuilder.must(QueryBuilders.matchQuery("intro", "今天是"));
        // filter
        boolQueryBuilder
                .filter(QueryBuilders.termQuery("userName", "小叮当"))
                .filter(QueryBuilders.rangeQuery("age").gt(1).lt(20));

        builder.withQuery(boolQueryBuilder);
        Page<EmpDoc> search = empElasticsearchRepository.search(builder.build());
        System.out.println("满足条件的数量:"+search.getTotalElements());
        System.out.println("页数:"+search.getTotalPages());
        search.getContent().forEach(System.out::println);


    }
}

总结

ElasticSearch最基本的使用,学习笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值