美文网首页
ElasticSearch

ElasticSearch

作者: _给我一支烟_ | 来源:发表于2020-08-22 07:54 被阅读0次

    一、直接在虚拟机中搭建 elasticsearch 环境

    1.运行需要 JAVA 环境

    2.elasticsearch 下载地址

    https://www.elastic.co/cn/downloads/past-releases#elasticsearch

    问题1: 下载后解压可能起不来:注意两点,1.不要用root用户启动,2.不要放在root家目录下面
    创建elsearch用户组及elsearch用户:

    groupadd elsearch
    useradd elsearch -g elsearch
    passwd elsearch
    更改elasticsearch文件夹及内部文件的所属用户及组为elsearch:elsearch

    cd /opt
    chown -R elsearch:elsearch elasticsearch-6.8.8
    切换到elsearch用户再启动

    su elsearch
    cd /opt/elasticsearch-6.8.8/bin
    ./elasticsearch

    问题2: 每个进程最大同时打开文件数太小
    max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
    修改 /etc/security/limits.conf

    *               soft    nofile          65536
    *               hard    nofile          65536
    *               soft    nproc           4096
    *               hard    nproc           4096
    

    执行命令 sysctl -p 生效

    问题3: elasticsearch用户拥有的内存权限太小,至少需要262144
    max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
    执行命令:
    sysctl -w vm.max_map_count=262144
    或修改 /etc/sysctl.conf
    vm.max_map_count=262144

    问题4: 外部浏览器无法访问
    修改配置文件 elaticsearch.yml 里面的
    network 0.0.0.0

    上面问题都解决了再次启动,并验证是否启动成功
    查看es健康状态:
    curl http://localhost:9200/_cat/health?v
    在浏览器上输入
    ip:9200 查看是否有json串出来

    3.kibana

    https://www.elastic.co/cn/downloads/past-releases/kibana-6-8-8
    修改kibana.yml配置,让其找到es的地址
    server.host: "0.0.0.0"
    elasticsearch.hosts: ["http://localhost:9200"]

    启动
    cd bin
    nohup ./kibana &

    4.分词

    有两种下载安装方式

    • 使用插件命令下载

    cd /opt/elasticsearch-6.8.8/bin
    ./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.8/elasticsearch-analysis-ik-6.8.8.zip

    • 手动下载拷贝

    https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v6.8.8
    下载elasticsearch-analysis-ik-6.8.8.zip包,在win下解压zip包
    cd /opt/elasticsearch-6.8.8/plugins
    mkdir ik
    把win解压的zip里面内容 拷贝到 ik目录下
    重启 elasticsearch


    二、在docker中搭建 elasticsearch 环境

    先在虚拟机中安装docker,参见docker教程:
    出现 docker0: iptables: No chain/target/match by that name 错误
    解决:重启docker
    service docker restart

    docker 下载镜像仓库地址:https://hub.docker.com/

    1.安装 elasticsearch

    docker pull docker.elastic.co/elasticsearch/elasticsearch:6.8.8

    2.启动es容器

    写个启动esRun.sh的启动脚本内容如下:

    docker run -itd  --name elasticsearch -v /docker/esdata:/usr/share/elasticsearch/data -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.8.8
    

    说明几点
    不要加 -rm 参数 这样重启后该容器会删除,在里面装的分词插件就没有了
    加 -v /docker/esdata:/usr/share/elasticsearch/data 把容器里的数据映射到本地这样可以写到磁盘永久保存,另外esdata权限改成777

    在浏览器中输入: 虚拟机ip:9200 验证,有json串返回说明启动成功

    3.进入到es容器中安装ik分词器插件

    docker exec -it elasticsearch /bin/bash
    ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.8/elasticsearch-analysis-ik-6.8.8.zip
    

    4.修改配置,解决跨域访问问题

    首先进入到容器中,然后进入到指定目录修改elasticsearch.yml文件。

    docker exec -it elasticsearch /bin/bash
    cd /usr/share/elasticsearch/config/
    vi elasticsearch.yml
    

    在elasticsearch.yml的文件末尾加上:

    http.cors.enabled: true
    http.cors.allow-origin: "*"
    

    修改配置后重启容器即可。

    docker restart elasticsearch
    

    5.安装 kibana

    docker pull kibana:6.8.8
    

    6.连接es并启动

    写个kibanaRun.sh脚本内容如下:

    docker run -itd --rm --name kibana --link=elasticsearch:test  -p 5601:5601 kibana:6.8.8 && docker start kibana
    

    在浏览器中输入: 虚拟机ip:5601 验证,出现kibana界面

    问题1:
    docker : 报错 WARNING: IPv4 forwarding is disabled. Networking will not work.
    解决方法:

    vi /usr/lib/sysctl.d/00-system.conf
    添加如下代码:
    net.ipv4.ip_forward=1
    重启network服务
    systemctl restart network
    

    三、elasticsearch

    1. 新建一个索引(类似mysql新建一个数据库实例),在kibana Dev Tools 里面操作
      PUT 索引名

    查看现有的索引
    http://192.168.121.223:9200/_cat/indices?v

    1. 创建表并插入一条数据
    PUT my_indnx/moive/2
    {
      "moive_name": "red event",
      "price":120,
      "time":"2018-11-10",
      "actors":[
        {"name": "zhaosi", "age":33, "sex":1},
        {"name": "achen", "age":43,"sex":1},
        {"name": "wangwu","age":23,"sex":2}
      ]
    }
    
    1. 简单的查询
      查所有
    GET my_indnx/moive/_search
    

    匹配查询

    GET my_indnx/moive/_search
    {
      "query": {
        "match": {
          "moive_name": "red event"
        }
      }
    }
    
    1. 删除一条数据
    DELETE my_indnx/moive/2
    
    1. 修改一条数据,与插入一条数据一样直接改里面的值即可,不用改的字段和数据也要带上否则那些字段会被删掉
    PUT my_indnx/moive/2
    {
      "moive_name": "red event",
      "price":333,
      "time":"2018-11-10",
      "actors":[
        {"name": "zhaosi", "age":33, "sex":1},
        {"name": "achen", "age":43,"sex":1},
        {"name": "wangwu","age":23,"sex":2}
      ]
    }
    

    在Elaticsearch 6.x版本中已经只允许一个索引下只有一个type,声明多个type已经标记为过期

    复合查询

    GET my_indnx_2/moive_2/_search
    {
      "query": {
        "bool": {
          "must": [
            {"match": {
              "moive_name": "行动"
            }}
          ], 
          "filter":{
            "term": {
              "moive_gsid": "3"
            }
          }
        }
      }
    }
    

    在新建index下的type表结构时,指定将来可能使用分词器的字段
    ik分词器主要有两个
    ik_smart:简单分词器,将以最小的组合拆分中文
    ik_max_word:最大化分词器,将以最大化结果分词

    GET _analyze 
    {
      "text": "我是中国人",
      "analyzer": "ik_max_word"
    }
    

    四、springboot 与 elasticsearch 整合

    一般来说有两种方式:

    1. Jest(默认不生效,需要下载依赖包)

    添加依赖

    <dependency>
        <groupId>io.searchbox</groupId>
        <artifactId>jest</artifactId>
        <version>6.3.1</version>
    </dependency>
    
    1. spring data (创建项目勾选了 NoSQL中的elasticsearch会自动添加依赖)

    ElasticsearchRepository 和 ElasticsearchTemplate 两种

    添加依赖

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

    jest 这种方式的查询需要拼json的查询语句,不是很方便

    ElasticsearchRepository 可以做Elasticsearch的相关增删改查,用法和普通的CRUDRepository是一样的,
    这样就能统一ElasticSearch和普通的JPA操作,获得和操作mysql一样的代码体验。但是同时可以看到
    ElasticsearchRepository的功能是比较少的,简单查询够用。

    ElasticsearchTemplate 则提供了更多的方法来完成更多的功能,也包括分页之类的,他其实就是一个封装
    好的ElasticSearch Util功能类,通过直接连接client来完成数据的操作。

    使用 ElasticsearchRepository 查询的时候报
    ElasticsearchException:failed to map source [xxx to class Book] with root cause 错误
    原因:
    这是因为在实体类Book中为了方便实例化添加了一个有参构造函数,导致JVM不能添加默认的无参构造函数了,但是jackson的反序列化需要使用无参构造函数,所以报错!
    解决:
    在实体类Book中添加一个无参构造函数就可以了!
    或者不写构造函数直接添加两个注解 @NoArgsConstructor @AllArgsConstructor

    相关文章

      网友评论

          本文标题:ElasticSearch

          本文链接:https://www.haomeiwen.com/subject/pcbmjktx.html