SpringBoot集成ElasticSearch(ES)

Posted 一个大泥球

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot集成ElasticSearch(ES)相关的知识,希望对你有一定的参考价值。

依赖

SpringBoot版本:2.4.2

 <dependencies>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
		  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
            <scope>true</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
    </dependencies>


    <dependencyManagement>
        <dependencies>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2020.0.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

先了解一下curl方式操作es

与SpringBoot集成

配置类

import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.RestClients;
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;

@Configuration
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
    @Override
    @Bean
    public RestHighLevelClient elasticsearchClient() {
        final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo("localhost:9200")
                .build();
        return RestClients.create(clientConfiguration).rest();
    }



}

实体类

import lombok.Data;
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;

@Data
@Document(indexName = "product", shards = 3, replicas = 1)
public class Product {

    //必须有 id,这里的 id 是全局唯一的标识,等同于 es 中的"_id"
    @Id
    private Long id;//商品唯一标识
    /**
     * type : 字段数据类型
     * analyzer : 分词器类型
     * index : 是否索引(默认:true)
     * Keyword : 短语,不进行分词
     */
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String title;//商品名称
    @Field(type = FieldType.Keyword)
    private String category;//分类名称
    @Field(type = FieldType.Double)
    private Double price;//商品价格
    @Field(type = FieldType.Keyword, index = false)
    private String images;//图片地址
}

测试例子

学得有点偷懒


@RestController
@RequestMapping
public class TestESController {
    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Resource
    ProductMapper productMapper;
    @GetMapping
    public void createIndex() {
        //创建索引,系统初始化会自动创建索引
        System.out.println("创建索引");
    }

    @DeleteMapping
    public void deleteIndex() {
        //创建索引,系统初始化会自动创建索引
        boolean flg = elasticsearchRestTemplate.deleteIndex(Product.class);
        System.out.println("删除索引 = " + flg);
    }

    @PostMapping
    public void save(){
        Product product = new Product();
        product.setId(1L);
        product.setTitle("华为手机");
        product.setCategory("手机");
        product.setPrice(2999.0);
        product.setImages("http://www.atguigu/hw.jpg");
        productMapper.save(product);
    }

    @PutMapping
    public void update(){
        Product product = new Product();
        product.setId(1L);
        product.setTitle("小米 2 手机");
        product.setCategory("手机");
        product.setPrice(9999.0);
        product.setImages("http://www.atguigu/xm.jpg");
        productMapper.save(product);
    }


    @GetMapping("/findById")
    public void findById(){
        Product product = productMapper.findById(1L).get();
        System.out.println(product);
    }

    @GetMapping("/findAll")
    public void findAll(){
        Iterable<Product> products = productMapper.findAll();
        for (Product product : products) {
            System.out.println(product);
        }
    }

    //删除
    @DeleteMapping("/delDocument")
    public void delete(){
        Product product = new Product();
        product.setId(1L);
        productMapper.delete(product);
    }
    //批量新增
    @PostMapping("/addBatch")
    public void saveAll(){
        List<Product> productList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Product product = new Product();
            product.setId(Long.valueOf(i));
            product.setTitle("["+i+"]小米手机");
            product.setCategory("手机");
            product.setPrice(1999.0+i);
            product.setImages("http://www.atguigu/xm.jpg");
            productList.add(product);
        }
        productMapper.saveAll(productList);
    }
    //分页查询
    @GetMapping("/findByPageable")
    public void findByPageable(){
        //设置排序(排序方式,正序还是倒序,排序的 id)
        Sort sort = Sort.by(Sort.Direction.DESC,"id");
        int currentPage=0;//当前页,第一页从 0 开始, 1 表示第二页
        int pageSize = 5;//每页显示多少条
        //设置查询分页
        PageRequest pageRequest = PageRequest.of(currentPage, pageSize,sort);
        //分页查询
        Page<Product> productPage = productMapper.findAll(pageRequest);
        for (Product Product : productPage.getContent()) {
            System.out.println(Product);
        }
    }
}

RestHighLevelClient直接操作

这些操作,就是javaApi,和上图中,通过http方式和es交互式类似的

索引操作


/**
 * 这里时测试,开发时:通过 ESTemplate操作。Spring进行了封装
 */
@Slf4j
public class ESIndexTestCase {
    public static void main(String[] args) throws IOException {

        // 创建客户端
        RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200)));

        // 创建索引
        // CreateIndexRequest indexRequest = new CreateIndexRequest("book");
        // CreateIndexResponse indexResponse = esClient.indices().create(indexRequest, RequestOptions.DEFAULT);
        // boolean acknowledged = indexResponse.isAcknowledged();
        // log.error("响应{}",acknowledged);

        // 查询索引
        // GetIndexRequest getIndexRequest = new GetIndexRequest("book");
        // GetIndexResponse getIndexResponse = esClient.indices().get(getIndexRequest, RequestOptions.DEFAULT);
        // log.info("getAliases:{}",getIndexResponse.getAliases());
        // log.info("getMappings:{}",getIndexResponse.getMappings());
        // log.info("getSettings:{}",getIndexResponse.getSettings());

        // 删除索引
        AcknowledgedResponse deleteRes = esClient.indices().delete(new DeleteIndexRequest("book"), RequestOptions.DEFAULT);
        boolean delAck = deleteRes.isAcknowledged();
        log.error("delAck:{}",delAck);
        esClient.close();
    }

}

文档操作



@Slf4j
public class ESDocmentTestCase {

    public static void main(String[] args) throws IOException {
        // 创建客户端
        RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200)));

        // 新增文档
        // IndexRequest indexRequest = new IndexRequest("user");
        // indexRequest.id("1001");
        //
        // // 准备文档
        // User user = new User();
        // user.setName("张三");
        // user.setAge(22);
        // user.setSex("男");
        //
        // String userJson = JSONObject.toJSONString(user);
        // indexRequest.source(userJson, XContentType.JSON);
        //
        // IndexResponse indexResponse = esClient.index(indexRequest, RequestOptions.DEFAULT);
        //
        // log.error("getResult:==========>:{}",indexResponse.getResult());

        // 批量新增文档

        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.add(new IndexRequest("user").id("2001").source(XContentType.JSON,"name","张三","age","40","sex","男"));
        bulkRequest.add(new IndexRequest("user").id("2002").source(XContentType.JSON,"name","222","age","10","sex","女"));
        bulkRequest.add(new IndexRequest("user").id("2003").source(XContentType.JSON,"name","33333","age","20","sex","男"));
        bulkRequest.add(new IndexRequest("user").id("2004").source(XContentType.JSON,"name","111","age","30","sex","男"));
        bulkRequest.add(new IndexRequest("user").id("2005").source(XContentType.JSON,"name","2222","age","31","sex","女"));
        BulkResponse bulkResponse = esClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        log.error("getResult:==========>:{}",bulkResponse.getTook());

        // 更新文档(全量更新,局部更新)

        // UpdateRequest updateRequest = new UpdateRequest("user", "1001");
        // updateRequest.doc("sex","dddddd");
        // UpdateResponse updateResponse = esClient.update(updateRequest, RequestOptions.DEFAULT);
        // log.error("getResult:==========>:{}",updateResponse.getResult());

        // 根据_id查询文档
        // GetRequest getRequest = new GetRequest("user", "1001");
        // GetResponse getResponse = esClient.get(getRequest, RequestOptions.DEFAULT);
        // log.error("getResult:==========>:{}",getResponse.getSource());


        // 根据_id 删除数据
        // DeleteRequest deleteRequest = new DeleteRequest("user", "1001");
        // DeleteResponse deleteResponse = esClient.delete(deleteRequest, RequestOptions.DEFAULT);
        // log.error("getResult:==========>:{}",deleteResponse.getResult());

        // 批量删除(和批量新增类似)




        esClient.close();
    }
}

检索操作


@Slf4j
public class EsSearchTest {
    public static void main(String[] args) throws IOException {
        // 创建客户端
        RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200)));

        // 查询所有
        // SearchRequest searchRequest = new SearchRequest("user");
        // SearchSourceBuilder queryBuilder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        // queryBuilder.from(0);
        // queryBuilder.size(4);
        // queryaBuilder.sort("age", SortOrder.DESC);
        // SearchRequest sourceRequest = searchRequest.source(queryBuilder);
        // SearchResponse searchResponse = esClient.search(sourceRequest, RequestOptions.DEFAULT);
        // log.error("getHits:======>{}", searchResponse.getHits().getTotalHits());
        // searchResponse.getHits().forEach(hit -> System.out.println(hit.getSourceAsString()));

        // 2-组合查询

        // SearchRequest searchRequest = new SearchRequest("user");
        // BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        //
        // // 这里就是组合条件。和mysql where 组合类似
        // boolQueryBuilder.should(QueryBuilders.matchQuery("age","30"));
        // boolQueryBuilder.should(QueryBuilders.matchQuery("age","40"));
        // SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(boolQueryBuilder);
        // searchRequest.source(sourceBuilder);
        //
        // SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT);
        // searchResponse.getHits().forEach(hit -> System.err.println(hit.getSourceAsString()));

        // 3-范围查询
        // SearchRequest searchRequest = new SearchRequest("user");
        // SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        // RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");
        // rangeQuery.gte("30");
        以上是关于SpringBoot集成ElasticSearch(ES)的主要内容,如果未能解决你的问题,请参考以下文章

精通系列SpringBoot集成ElasticSearch+项目实战

精通系列SpringBoot集成ElasticSearch+项目实战

精通系列SpringBoot集成ElasticSearch+项目实战

springboot集成ElasticSearch

springboot集成elk 三:springboot + Elasticsearch Rest-Client

springboot集成elasticsearch全文搜索高亮显示实践