zoukankan      html  css  js  c++  java
  • java-es理论

    导读:

    第一节:原理与过程

      1:底层

      2:过程

    第二节:集群策略与搭建

      1:分发策略

      2:搭建

    第三节:对比

      1:对比solr

      2:对比数据库

    第四节:操作

      1:rest,curl

      2:java操作

     

    第一节:原理与过程

      1、底层(基于luceue框架)

        Luceue

          倒排索引

            对数据进行分词处理,信息存储(位置,数量,偏移量)

            例子:

              我是中国人。

              中国是全球人口最多的国家,中国人也最多(2)

              1:我 (1:1){0}(第一行,有一个,索引0)

              2:中国 (1:1) {2},(2:2){0,15} (第一行,有一个,索引2)(第二行,有两个,索引0和15位置)

          正排索引:

            对数据进行分词处理,生成索引。

            缺点:数量太大

        Document:存储的基本单位,类似java类,以json格式存数据

          包含:

            context:内容

            Size:大小

            Path:数据来源

      2、过程

        数据

          --->document的形式

          ---->对document中的context进行分词处理(ik分词器)

          ---->对分词进行倒排索引

            ---->是否保存之前的document

            ---->强制生成新的ducument(索引的)

              新的document可选择的保存需要的:

                唯一ID:倒排索引之后的ID

                Path:(必选)

                Size::(选存)

                Context:(选存,列表中的简要提示用)

     

      3、单机所能承载的数据峰值,速度,依据企业的业务量

     

    第二节:集群策略与搭建

      1、分发策略

        Master 是去中心化的,很淡化了。

          在一个服务器上启动一个执行代理,即master,进行数据的请求及数据统一回收等

        分发策略(hashcode%lucenu主片个数)hashcode是document的ID的hash

          一个节点放多个lucene主片,所以可以采用多个lucene主片分发到各个节点。这样如果需要扩充,只需要给片迁移就可以了。

     

      2、搭建:

        2.1 不能用root用户:es有远程执行脚本的功能,容易中木马。

          创建普通用户

            Useradd 名字

            Passwd  名字

          切换用户

            Su 名字   switch user

          修改权限

            Chown 用户:用户 -R 文件夹 change own

     

        2.2 下载安装目录包:

          Yum install unzip

          unzip elasticsearch-6.4.1.zip -d /opt/sxt/es

     

        2.3 修改配置文件:

          Cluster.name //集群名称

          Node.name 别名

          Network.host //服务器IP

          http.host 9200 //与网页的通讯端口

          防脑裂

            discovery.zen.ping.multicast.enabled: false //多重广播,来一台自动加进一台到集群,这里手动,否则容易脑裂

            discovery.zen.ping.unicast.hosts: ["192.168.133.6","192.168.133.7", "192.168.133.8"]

            discovery.zen.ping_timeout: 120s

            client.transport.ping_timeout: 60s

     

        2.4 可视化插件:

          原因:本身是json格式的显示,用这个插件让es的运行状况可视化

          操作:资料/附件 中的plugins 导入到es路径下,修改权限,也可以不修改

     

        2.5 启动:要每一台都启动

          ./elasticsearch

     

        2.6 测试插件效果:plugin插件

          http://ip:9200/_plugin/head 即:http://192.168.133.6:9200/_plugin/head?pretty

    第三节:对比

      1、与solr的对比:

        Solr是静态数据,即先将数据存进来

        Es是动态数据,不断有新数据进来

        Es速度比solr也快

     

      2、对比:

         

     

    第四节:操作

      1、Rest:操作es数据库的架构风格,类似于接口,给用户来进行增删改查操作

        Get 获取

        Put 修改(ID存在的是修改,不存在的是新建)

        Post 新建

        Delete 删除

        Head 头信息

         

        实际操作:

        Curl操作:

          curl -XPUT http://192.168.133.6:9200/test/  //创建库

          Curl -XDELETE ... //删除库

     

          //在test(index)下的employee(type)中建立一个doc {...doc内容}

          //也可以像PUT一样指定id,与put中相同,所以POST更加灵活,不需要用put,post就都可以搞定了

          curl -XPOST http://192.168.133.6:9200/test/employee -d ' //test相当于库。employee相当于表。

          { //相当于一行数据

             "first_name" : "bin", //字段

             "age" : 33,

             "about" : "I love to go rock climbing",

             "interests": [ "sports", "music" ]

          }'

     

          //put形式:需要定义id,例子中的111(如果是id已经存在的会更新数据,非创建)

          curl -XPUT http://192.168.133.6:9200/test/employee/111 -d '

          {

             "first_name" : "god bin",

             "last_name" : "pang",

             "age" : 42,

             "about" : "I love to go rock climbing",

             "interests": [ "sports", "music" ]

          }'

     

          //查询,pretty是显示格式化

          curl -XGET http://192.168.133.6:9200/test/employee/1?pretty

     

          //查找first_name字段下所有含有’bin’的

          curl -XGET http://192.168.133.6:9200/test/employee/_search?q=first_name="bin"

     

          //规范的查询,同上的查询

          curl -XGET http://192.168.133.6:9200/test/employee/_search?pretty -d '

          {

           "query":

            {"match":

              {"first_name":"bin"}

             }

          }'

      

          //多个field查询,last_name 和first_name中都含有’bin’的

          curl -XGET http://192.168.133.6:9200/test/employee/_search?pretty -d '

          {

          "query":

             {"multi_match":

              {

                "query":"bin",

                "fields":["last_name","first_name"],

                "operator":"and"

              }

            }

          }'

     

          //多个term对多个field发起查询:bool(boolean)

          //组合查询,must,must_not,should

          //must : 必须满足

          //must_not :必须不能满足

          //should+should  : 并集

          curl -XGET http://192.168.133.6:9200/test/employee/_search?pretty -d '

          {

           "query":

            {"bool" :

               {

              "must" :

                   {"match":

                  {"first_name":"bin"}

                },

               "must" :

                {"match":

                  {"age":33}

                }

              }

            }

          }'

     

          //修改配置

          //创建test2库,这个库里有2个从

            curl -XPUT 'http://192.168.133.6:9200/test2/' -d'{"settings":{"number_of_replicas":2}}'

          //创建test3库,这个库有3个主,3个从(主是分布在各个节点,从放在非主的其它节点,所以从的个数要小于集群节点个数)

            curl -XPUT 'http://192.168.133.6:9200/test3/' -d'{"settings":{"number_of_shards":3,"number_of_replicas":3}}'

     

      2、java操作(在java-es的其他随笔中有详细写出)

     

      3、分词器(ik) 及配置文件修改、分发(es与ik之间有相互的对应版本

        版本 文件 安装

        在es的plugins下创建目录,解压ik在这个下面。

        修改配置:

          elasticsearch.version //版本对应上

     

  • 相关阅读:
    DENIED Redis is running in protected mode
    Redis接口的调用
    Redis复制
    Redis安全
    Redis持久化
    Redis简单示例
    【T11】提防对等实体的不友好动作
    【T10】记住,TCP__IP不是轮询的
    Python中的with语句
    postgreSQL中timestamp转成date格式
  • 原文地址:https://www.cnblogs.com/dblog/p/12173295.html
Copyright © 2011-2022 走看看