elasticsearch 7.9.1 docker安装 集成springBoot

elasticsearch 7.9.1 docker安装 集成springBoot
本人学习es的过程记录
网址:
elasticsearch官网 https://www.elastic.co/cn/elasticsearch
docker hub https://hub.docker.com/

搭建环境

  1. docker下载 elasticsearch, elasticsearch-head, kibana三个镜像
    docker pull elasticsearch:7.9.1
    docker pull mobz/elasticsearch-head:5
    docker pull kibana:7.9.1
  2. 运行镜像
    复制的时候看清楚引号("")是英文输入法下的
    docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” elasticsearch:7.9.1
    docker run -d --name kibana -e “I18N_LOCALE=zh-CN” --link=elasticsearch:elasticsearch --net somenetwork -p 5601:5601 kibana:7.9.1
    docker run -d --name elasticsearch-head --net somenetwork -p 9100:9100 mobz/elasticsearch-head:5
  3. 配置跨域
    运行起来后,进入elasticsearch容器, docker exec -it elasticsearch /bin/bash, 进入目录/usr/share/elasticsearch/config中, 修改配置文件elasticsearch.yml, (但是容器没有vi方法, 我是复制到主机docker cp 容器名:目录/文件 本地目录/ 修改好之后,再 复制到容器 docker cp 本地目录/文件 容器名:目录/) , 增加跨域配置: http.cors.enabled: true, http.cors.allow-origin: “*”
  4. 安装ik分词器
    在elasticsearch容器bin目录下, 运行 elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.1/elasticsearch-analysis-ik-7.9.1.zip, 安装完退出容器, 重启容器
  5. 连接报错
    elasticsearch-head 连接elasticsearch报错406问题, 我的解决方法是 进入head容器(由于vi命令无法使用, 我也是复制到主机上修改好再复制到容器的), 编辑/usr/src/app/_site/vendor.js, 6886行和7574行 "application/x-www-form-urlencoded 改成 “application/json;charset=UTF-8”
  6. 安全认证:
    (补充安全认证,配置用户名密码参考)
    挂载数据文件,插件和配置文件到本地, 运行命令如下(复制的时候看清楚引号("")是英文输入法下的)
    docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -v /home/es/data:/usr/share/elasticsearch/data -v /home/es/plugins:/usr/share/elasticsearch/plugins -v /home/es/config/es.yml:/usr/share/elasticsearch/config/elasticsearch.yml -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -e “discovery.type=single-node” --restart=always elasticsearch:7.9.1

docker run -d -it --restart=always --privileged=true --name=kibana -p 5601:5601 -v/home/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.9.1

一、kibana控制台操作

在上面进行crud操作, 这个就是restful + json发送指令

二、elasticsearch-head数据浏览

三、集成SpringBoot

参考文档:

  1. 引入maven
<properties>
	<elasticsearch.version>7.9.1</elasticsearch.version>
</properties>
<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
	</dependency>
	<dependency>
		<groupId>org.elasticsearch.client</groupId>
		<artifactId>elasticsearch-rest-high-level-client</artifactId>
		<version>${elasticsearch.version}</version>
	</dependency>
	<dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.4</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.60</version>
    </dependency>
</dependencies>
  1. 依赖注入RestHighLevelClient
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ElasticSearchClientConfig {

    @Bean
    public RestHighLevelClient restHighLevelClient() {
        return new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("192.168.110.159", 9200, "http")));
    }

	//需要用户名和密码的认证
	@Bean
    public RestHighLevelClient restHighLevelClient() {
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "123456"));
        RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost("192.168.110.159", "9200", "http"))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
                        return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                });
        return new RestHighLevelClient(restClientBuilder);
    }
}
  1. 测试crud创建索引和文档等
    UserVo实体类自定义
import com.alibaba.fastjson.JSON;
import com.ph.entity.UserVo;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

@SpringBootTest
class EsClientApplicationTests {
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Test
    void testCreateIndex() throws IOException {
        CreateIndexRequest request = new CreateIndexRequest("ph_index");
        CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
        System.out.println(response);
    }

    @Test
    void testGetIndex() throws IOException {
        GetIndexRequest request = new GetIndexRequest("ph_index");
        boolean response = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
        System.out.println(response);
    }

    @Test
    void testDeleteIndex() throws IOException {
        DeleteIndexRequest request = new DeleteIndexRequest("match");
        AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
        System.out.println(delete.isAcknowledged());
    }

    @Test
    void addDocument() throws IOException {
        IndexRequest request = new IndexRequest("ph_index");
        UserVo userVo = new UserVo();
        userVo.setName("酸梅膏2");
        userVo.setAge(19);
        userVo.setBirthday(new Date());
        request.id("1");
        request.source(JSON.toJSONString(userVo), XContentType.JSON);

        IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
        System.out.println(response.toString());
        System.out.println(response.status());
    }

    @Test
    void getIsExists() throws IOException {
        GetRequest request = new GetRequest("ph_index", "JJxLbHQBSLYVMtZRYQtQ");
        request.fetchSourceContext(new FetchSourceContext(false));
        request.storedFields("_none_");

        boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
        System.out.println(exists);
    }

    @Test
    void getGetDocument() throws IOException {
        GetRequest request = new GetRequest("ph_index", "1");

        GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
        System.out.println(response.getSourceAsString());
        System.out.println(response);
    }

    @Test
    void getUpdateDocument() throws IOException {
        UpdateRequest request = new UpdateRequest("ph_index", "1");

        UserVo userVo = new UserVo();
        userVo.setName("绿豆汤");
        request.doc(JSON.toJSONString(userVo), XContentType.JSON);


        UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
        System.out.println(response.toString());
        System.out.println(response.status());
    }

    @Test
    void getDeleteDocument() throws IOException {
        DeleteRequest request = new DeleteRequest("ph_index", "JJxLbHQBSLYVMtZRYQtQ");
        request.timeout("1s");

        DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
        System.out.println(response.status());
    }

    @Test
    void bulkDocument() throws IOException {
        BulkRequest request = new BulkRequest();
        List<UserVo> list = new ArrayList<>();
        list.add(new UserVo("xiao按", 13, new Date()));
        list.add(new UserVo("xiao按2", 11, new Date()));
        list.add(new UserVo("xiao按3", 15, new Date()));
        list.add(new UserVo("xiao按4", 16, new Date()));

        for (int i = 0; i < list.size(); i++) {
            request.add(new IndexRequest("ph_index")
                    .id("" + (i + 1)).source(JSON.toJSONString(list.get(i)), XContentType.JSON));
        }

        BulkResponse response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
        System.out.println(response.toString());
        System.out.println(response.status());
    }

    @Test
    void searchDocument() throws IOException {
        SearchRequest searchRequest = new SearchRequest("ph_index");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.highlighter(new HighlightBuilder().field("name"));
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "xiao按");
        sourceBuilder.query(matchQueryBuilder);
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

        searchRequest.source(sourceBuilder);
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(JSON.toJSONString(response));

        for (SearchHit hit : response.getHits().getHits()) {
            System.out.println(hit.getSourceAsMap());
        }
    }
	/**
     * 更新索引文档的对象数组里面的一项数据, 如果存在则更新, 不存在则新增
     * lotteryVo 参数, 更新的对象数据
     * ctx._source.lotterys 文档数组对象字段
     * @throws IOException
     */
    @Test
    void testScriptUpdateDocument() throws IOException {
        String scriptString = "if (ctx._source.lotterys == null) {\n" +
                "            ctx._source.lotterys = [params.tag];\n" +
                "          } else {\n" +
                "            boolean t = true;\n" +
                "            for(int i = 0; i < ctx._source.lotterys.length; i++) {\n" +
                "              if (ctx._source.lotterys[i].id == params.tag.id) {\n" +
                "                ctx._source.lotterys[i].lotteryType = params.tag.lotteryType;\n" +
                "                ctx._source.lotterys[i].showIssueNum = params.tag.showIssueNum;\n" +
                "                t = false;\n" +
                "              }\n" +
                "            }\n" +
                "            if (t) {\n" +
                "              ctx._source.lotterys.add(params.tag);\n" +
                "            }\n" +
                "          }";
        Map<String, Object> params = new HashMap<>();
        params.put("tag", JSON.parseObject(JSON.toJSONString(lotteryVo)));
        Script script = new Script(ScriptType.INLINE, "painless", scriptString, params);
        UpdateRequest request = new UpdateRequest("index", "id");
        request.script(script);
        UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
    }
	/**
     * eventVo 更新的数据
     */
    @Test
    void testUpdateByQueryDocument() throws IOException {
        try {
            String scriptString = "ctx._source.eventJson = params.eventJson";
            Map<String, Object> params = new HashMap<>();
            params.put("eventJson", JSON.parseObject(JSON.toJSONString(eventVo)));
            Script script = new Script(ScriptType.INLINE, "painless", scriptString, params);
            UpdateByQueryRequest request = new UpdateByQueryRequest("index");
            request.setScript(script);
            request.setQuery(QueryBuilders.termQuery("event_id", eventVo.getId()));
            BulkByScrollResponse response = restHighLevelClient.updateByQuery(request, RequestOptions.DEFAULT);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

总结

每天多一点点的努力,不为别的,只为了日后能够多一些选择,选择淡看云卷云舒的小日子,选择自己喜欢的人,自己想要的东西,要么奋力直追,要么干脆放弃。别总是逢人就喋喋不休的表决心或者哀怨不断,做别人茶余饭后的笑点。


版权声明:本文为qq_33638256原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。