Elasticsearchik分词器安装SpringBoot整合docker安装ESKibananginx

Posted 李潘杜若

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearchik分词器安装SpringBoot整合docker安装ESKibananginx相关的知识,希望对你有一定的参考价值。

一、简介

​ Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是一套适用于数据采集、扩充、存储、分析和可视化的免费开源工具。人们通常将 Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向 Elasticsearch 发送数据。

​ Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的

接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。

REST API:天然的跨平台。

官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

官方中文:https://www.elastic.co/guide/cn/elasticsearch/guide/current/foreword_id.html

二、Docker 安装 Es和Kibana

  1. 拉取镜像文件

    # 存储和检索数据
    docker pull elasticsearch:7.4.2
    
    # 可视化检索数据
    docker pull kibana:7.4.2
    
  2. 配置挂载数据文件夹

    # 创建配置文件目录
    mkdir -p /mydata/elasticsearch/config
    
    # 创建数据目录
    mkdir -p /mydata/elasticsearch/data
    
    # 将/mydata/elasticsearch/文件夹中文件都可读可写
    chmod -R 777 /mydata/elasticsearch/
    
    # 配置任意机器可以访问 elasticsearch
    echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml
    
  3. 启动Elasticsearch

    docker run --name elasticsearch --restart=always -p 9200:9200 -p 9300:9300 \\
    -e  "discovery.type=single-node" \\
    -e ES_JAVA_OPTS="-Xms64m -Xmx512m" \\
    -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \\
    -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \\
    -v  /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \\
    -d elasticsearch:7.4.2 
    
    # -p 9200:9200 -p 9300:9300:向外暴露两个端口,9200用于HTTP REST API请求,9300 ES 在分布式集群状态下 ES 之间的通信端口;
    # -e  "discovery.type=single-node":es 以单节点运行
    # -e ES_JAVA_OPTS="-Xms64m -Xmx512m":设置启动占用内存,不设置可能会占用当前系统所有内存
    # -v:挂载容器中的配置文件、数据文件、插件数据到本机的文件夹;
    # -d elasticsearch:7.6.2:指定要启动的镜像
    
    #访问 IP:9200 看到返回的 json 数据说明启动成功。
    
  4. 启动可视化Kibana

    docker run --name kibana --restart=always \\
    -e ELASTICSEARCH_HOSTS=http://192.168.0.11:9200 \\
    -p 5601:5601 \\
    -d kibana:7.4.2
    
    # -e ELASTICSEARCH_HOSTS=http://192.168.0.11:9200: 这里要设置成自己的虚拟机IP地址
    # http://192.168.0.11:5601/
    

三、安装ik分词器

注意:下载ES对应版本的ik分词器

1. ik分词器下载地址:

https://github.com/medcl/elasticsearch-analysis-ik/releases

2. 解压.ZIP—>移动到Es容器内部 plugins 目录下

3. 授权

chmod -R 777 ik

4. 重启ES

5. 测试分词器

POST _analyze

  "analyzer": "ik_smart", 
  "text": "我是中国人"


POST _analyze

  "analyzer": "ik_max_word",
  "text": "我是中国人"

6.自定义词库(这里需安装nginx)

#修改/usr/share/elasticsearch/plugins/ik/config/中的 IKAnalyzer.cfg.xml
vim /mydata/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml

#原来的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict"></entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

#修改过后的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict"></entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典-->  
        <!--nginx 发布静态资源,按照请求路径,创建对应的文件夹以及文件,放在 nginx 的 html下-->
        <entry key="remote_ext_dict">http://192.168.1.123/es/fenci.txt</entry>
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

重启ES

四、Docker安装 nginx

  • 随便启动一个 nginx 实例,只是为了复制出配置
docker run -p 80:80 --name nginx -d nginx:1.10
  • 将容器内的配置文件拷贝到当前目录
docker container cp nginx:/etc/nginx .
  • 修改文件名称:mv nginx conf 把这个 conf 移动到/mydata/nginx 下
  • 终止原容器:docker stop nginx
  • 执行命令删除原容器:docker rm nginx
  • 创建新的 nginx;执行以下命令
docker run -p 80:80 --name nginx \\
-v /mydata/nginx/html:/usr/share/nginx/html \\
-v /mydata/nginx/logs:/var/log/nginx \\
-v /mydata/nginx/conf:/etc/nginx \\
-d nginx:1.10
  • 给 nginx 的 html 下面放的所有资源可以直接访问
vim index.html
#写测试文字,例:如下所示
<h1>Hello Nginx</h1>

五、检索格式

1、检索信息

GET bank/_search  #检索 bank 下所有信息,包括 type 和 docs
GET bank/_search?q=*&sort=account_number:asc  #请求参数方式检索

响应结果

took - Elasticsearch 执行搜索的时间(毫秒) 
time_out - 告诉我们搜索是否超时 
_shards - 告诉我们多少个分片被搜索了,以及统计了成功/失败的搜索分片 
hits - 搜索结果 
hits.total - 搜索结果 
hits.hits - 实际的搜索结果数组(默认为前 10 的文档) 
sort - 结果的排序 key(键)(没有则按 score 排序) 
score 和 max_score –相关性得分和最高得分(全文检索用)

2、_cat

GET /_cat/nodes:  #查看所有节点 
GET /_cat/health: #查看 es 健康状况 
GET /_cat/master: #查看主节点 
GET /_cat/indices:#查看所有索引 show databases;

3、样本测试数据

https://gitee.com/xlh_blog/common_content/blob/master/es%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE.json

4、插入(导入)测试数据

POST bank/account/_bulk
#测试数据

六、SpringBoot整合

官网:https://www.elastic.co/guide/en/elasticsearch/client/index.html

1、导入依赖


       <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.4.2</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.4.2</version>
            <scope>compile</scope>
        </dependency>

2、编写配置文件

public static final RequestOptions COMMON_OPTIONS;
    static 
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
        /*builder.addHeader("Authorization", "Bearer " + TOKEN);
        builder.setHttpAsyncResponseConsumerFactory(
                new HttpAsyncResponseConsumerFactory
                        .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));*/
        COMMON_OPTIONS = builder.build();
    

@Bean 
RestHighLevelClient client()  
  RestClientBuilder builder = RestClient.builder(new HttpHost("192.168.1.123", 9200, "http")); 	   return new RestHighLevelClient(builder); 

3、测试

	/**
     * 检索测试
     */
    @Test
    public void searchData() throws IOException 
        //1、创建检索请求
        SearchRequest searchRequest = new SearchRequest();
        //指定索引
        searchRequest.indices("bank");
        //检索条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //1.1、构造检索条件
        searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
        System.out.println(searchSourceBuilder.toString());

        searchRequest.source(searchSourceBuilder);

        //2、执行检索
        SearchResponse searchResponse = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);

        //3、分析结果searchResponse
        System.out.println(searchResponse.toString());
    


	/**
     * 测试存储数据到es
     * 更新也可以
     */
    @Test
    public void indexData() throws IOException 
        IndexRequest indexRequest = new IndexRequest("users");
        indexRequest.id("1"); //数据id
        //indexRequest.source("username","zhangsan","age",18,"gender","男");
        User user = new User();
        user.setUserName("zhangsan");
        user.setAge(18);
        user.setGender("男");
        String jsonString = JSON.toJSONString(user);
        indexRequest.source(jsonString, XContentType.JSON);//要保存的内容

        //执行操作
        IndexResponse index = client.index(indexRequest, ElasticSearchConfig.COMMON_OPTIONS);
        System.out.println(index);
    

    @Data
    class User
        private String userName;
        private String gender;
        private Integer age;
    

以上是关于Elasticsearchik分词器安装SpringBoot整合docker安装ESKibananginx的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch IK 分词器快速上手

2021年大数据ELK:Elasticsearch安装IK分词器插件

2021年大数据ELK:Elasticsearch安装IK分词器插件

ElasticSearchIK分词加入标点符号

分词器以及ik中文分词器

(06)ElasticSearch 分词器介绍及安装中文分词器