ElasticSearch installation and deployment and integration of springboot

  • Because every time the project is used, every time it is rebuilt, it will step on the pits. Some pits are hereby recorded to prevent spending a lot of time on construction and integration.
  • Install

Prepare the compressed package elasticsearch-6.2.4 for decompression

  1. Configure the file elasticsearch.yml under the config folder, you can change your favorite port and configuration account password
  2. Install Chinese word breaker

 Note that the tokenizer version should be consistent with elasticsearch

Put the decompressed folder into the plugins directory under the ES root directory, restart ES to use it

Releases · medcl/elasticsearch-analysis-ik · GitHub

Two, configure the cluster

3.1 Create elasticsearch-cluster folder

Replicate three elasticsearch services internally.

3.2 Modify the config/elasticsearch.yml configuration file of each node in the cluster file directory

node-1001 node

#节点 1 的配置信息:

#集群名称,节点之间要保持一致

cluster.name: my-elasticsearch

#节点名称,集群内要唯一

node.name: node-1001

node.master: true

node.data: true

#ip 地址

#必须要指定ip,若localhost则只能本机访问

network.host: localhost

#http 端口

http.port: 1001

#tcp 监听端口

transport.tcp.port: 9301

#discovery.seed_hosts: ["localhost:9301", "localhost:9302","localhost:9303"]

#discovery.zen.fd.ping_timeout: 1m

#discovery.zen.fd.ping_retries: 5

#集群内的可以被选为主节点的节点列表

#cluster.initial_master_nodes: ["node-1", "node-2","node-3"]

#跨域配置

#action.destructive_requires_name: true

http.cors.enabled: true

http.cors.allow-origin: "*"

node-1002 node

#节点 2 的配置信息:

#集群名称,节点之间要保持一致

cluster.name: my-elasticsearch

#节点名称,集群内要唯一

node.name: node-1002

node.master: true

node.data: true

#ip 地址

network.host: localhost

#http 端口

http.port: 1002

#tcp 监听端口

transport.tcp.port: 9302

discovery.seed_hosts: ["localhost:9301"]

discovery.zen.fd.ping_timeout: 1m

discovery.zen.fd.ping_retries: 5

#集群内的可以被选为主节点的节点列表

#cluster.initial_master_nodes: ["node-1", "node-2","node-3"]

#跨域配置

#action.destructive_requires_name: true

http.cors.enabled: true

http.cors.allow-origin: "*"

If necessary, delete all contents of the data directory on each node. Prevent error

3.3 Start the cluster

Double-click the bin/elasticsearch.bat of the execution node in turn to start the node server (you can write a script to start it). After startup, it will automatically join the cluster with the specified name.

3.4 Test cluster

1. Use Postman to view the cluster status

GET http://127.0.0.1:1001/_cluster/health

GET http://127.0.0.1:1002/_cluster/health

GET http://127.0.0.1:1003/_cluster/health

success if returned

3. Fragmentation

Four, springboot integration

1. First add maven dependency in pom.xml

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>

<!--<version>2.2.6.RELEASE</version>-->

<!--这里可不具体版本,会自动按照springboot版本注入合适版本-->

</dependency>

The version requirements are specific to the official

Spring Data Elasticsearch - Reference Documentation

2. Add in the springboot configuration file

There are two ways

The first is to connect through port tcp 9300. This version of springboot is compatible with the version of elasticsearch

Spring.data.elasticsearch.repositories.enabled= true

Spring.data.elasticsearch.cluster-nodes= 127.0.0.1:9300

Spring.data.elasticsearch.cluster-name=  elasticsearch

This method uses ElasticSearchTemplate

The other is through http

Spring.elasticsearch.rest.uris= 172.0.11.121:9201

This method uses ElasticSearchRestTemplate

In this way, the versions of springboot and elasticsearch must meet the official requirements

If the project contains redis dependencies

Then add in the startup class

System.setProperty("es.set.netty.runtime.available.processors","false");

Do not use netty of es, but use redis.

3. Entity classes that need to store data into es need to add annotations

@Document(indexName = "shopping", shards = 3, replicas = 1,type="product")

//indexName相当于数据库的库名,type 相当于表名

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;//图片地址

}

4. Configuration class

ElasticsearchRestTemplate is a class in the spring-data-elasticsearch project, similar to templates in other spring projects.

In the new version of spring-data-elasticsearch, ElasticsearchRestTemplate replaces the original ElasticsearchTemplate.

The reason is that ElasticsearchTemplate is based on TransportClient, and TransportClient will be removed in versions after 8.x. Therefore, we recommend using ElasticsearchRestTemplate.

ElasticsearchRestTemplate is based on the RestHighLevelClient client. You need to customize the configuration class, inherit AbstractElasticsearchConfiguration, and implement the elasticsearchClient() abstract method to create a RestHighLevelClient object.

  1. Requires a custom configuration class

Inherit AbstractElasticsearchConfiguration and implement the elasticsearchClient() abstract method to create a RestHighLevelClient object.

import lombok.Data;

import org.apache.http.HttpHost;

import org.elasticsearch.client.RestClient;

import org.elasticsearch.client.RestClientBuilder;

import org.elasticsearch.client.RestHighLevelClient;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;



@ConfigurationProperties(prefix = "elasticsearch")

@Configuration

@Data

public class ElasticsearchConfig extends AbstractElasticsearchConfiguration{



    private String host ;

    private Integer port ;

    //重写父类方法

    @Override

    public RestHighLevelClient elasticsearchClient() {

        RestClientBuilder builder = RestClient.builder(new HttpHost(host, port));

        RestHighLevelClient restHighLevelClient = new

                RestHighLevelClient(builder);

        return restHighLevelClient;

    }

}

  1. DAO Data Access Object
import com.lun.model.Product;

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

import org.springframework.stereotype.Repository;



@Repository

public interface ProductDao extends ElasticsearchRepository<Product, Long>{



}

  1. crud operation
import com.lun.dao.ProductDao;

import com.lun.model.Product;

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.domain.Sort;

import org.springframework.test.context.junit4.SpringRunner;



import java.util.ArrayList;

import java.util.List;



@RunWith(SpringRunner.class)

@SpringBootTest

public class SpringDataESProductDaoTest {



    @Autowired

    private ProductDao productDao;

    /**

     * 新增

     */

    @Test

    public void save(){

        Product product = new Product();

        product.setId(2L);

        product.setTitle("华为手机");

        product.setCategory("手机");

        product.setPrice(2999.0);

        product.setImages("http://www.atguigu/hw.jpg");

        productDao.save(product);

    }

    //POSTMAN, GET http://localhost:9200/product/_doc/2



    //修改

    @Test

    public void update(){

        Product product = new Product();

        product.setId(2L);

        product.setTitle("小米 2 手机");

        product.setCategory("手机");

        product.setPrice(9999.0);

        product.setImages("http://www.atguigu/xm.jpg");

        productDao.save(product);

    }

    //POSTMAN, GET http://localhost:9200/product/_doc/2





    //根据 id 查询

    @Test

    public void findById(){

        Product product = productDao.findById(2L).get();

        System.out.println(product);

    }



    @Test

    public void findAll(){

        Iterable<Product> products = productDao.findAll();

        for (Product product : products) {

            System.out.println(product);

        }

    }



    //删除

    @Test

    public void delete(){

        Product product = new Product();

        product.setId(2L);

        productDao.delete(product);

    }

    //POSTMAN, GET http://localhost:9200/product/_doc/2



    //批量新增

    @Test

    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);

        }

        productDao.saveAll(productList);

    }



    //分页查询

    @Test

    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 = productDao.findAll(pageRequest);

        for (Product Product : productPage.getContent()) {

            System.out.println(Product);

        }

    }

}

  1. Complex Query Search Operations
import com.lun.dao.ProductDao;

import com.lun.model.Product;

import org.elasticsearch.index.query.QueryBuilders;

import org.elasticsearch.index.query.TermQueryBuilder;

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.test.context.junit4.SpringRunner;



@RunWith(SpringRunner.class)

@SpringBootTest

public class SpringDataESSearchTest {



    @Autowired

    private ProductDao productDao;

    /**

     * term 查询

     * search(termQueryBuilder) 调用搜索方法,参数查询构建器对象

     */

    @Test

    public void termQuery(){

        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "小米");

                Iterable<Product> products = productDao.search(termQueryBuilder);

        for (Product product : products) {

            System.out.println(product);

        }

    }

    /**

     * term 查询加分页

     */

    @Test

    public void termQueryByPage(){

        int currentPage= 0 ;

        int pageSize = 5;

        //设置查询分页

        PageRequest pageRequest = PageRequest.of(currentPage, pageSize);

        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "小米");

                Iterable<Product> products =

                        productDao.search(termQueryBuilder,pageRequest);

        for (Product product : products) {

            System.out.println(product);

        }

    }



}

package api

: Use of ElasticsearchTemplate - Short Book

Guess you like

Origin blog.csdn.net/qq_38623939/article/details/128456303