Elasticsearch

ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多员工能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 语言开发的,并作为 Apache 许可条款下的开放源码发布,是一种流行的企业级搜索引擎。

ElasticSearch 用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

ES特点和优势

  • 全文检索:是将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。
  • 倒排索引:由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
  • 分布式实时文件存储,可将每一个字段存入索引,使其可以被检索到。
  • 实时分析的分布式搜索引擎。
    分布式:索引分拆成多个分片,每个分片可有零个或多个副本。集群中的每个数据节点都可承载一个或多个分片,并且协调和处理各种操作;
    负载再平衡和路由在大多数情况下自动完成。
  • 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。也可以运行在单台PC上(已测试)
  • 支持插件机制,分词插件、同步插件、Hadoop插件、可视化插件等。
  • 标准化规则:建立倒排索引的时候,会对拆分出的各个单词进行相应的处理,以提升后面搜索的时候能够搜索到相关联的文档的概率。

工作原理

当ElasticSearch的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置)寻找集群中的其它节点,并与之建立连接。

核心概念

  • Cluster(集群):ES可以作为一个独立的单个搜索服务器。不过,为了处理大型数据集,实现容错和高可用性,ES可以运行在许多互相合作的服务器上
  • Node(节点):形成集群的每个服务器称为节点。
  • Shard(分片):当有大量的文档时,由于内存的限制、磁盘处理能力不足、无法足够快的响应客户端的请求等,一个节点可能不够。这种情况下,数据可以分为较小的分片。每个分片放到不同的服务器上。 当你查询的索引分布在多个分片上时,ES会把查询发送给每个相关的分片,并将结果组合在一起,而应用程序并不知道分片的存在。即:这个过程对用户来说是透明的
  • Replia(副本):为提高查询吞吐量或实现高可用性,可以使用分片副本。 副本是一个分片的精确复制,每个分片可以有零个或多个副本。ES中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。
    当主分片丢失时,如:该分片所在的数据不可用时,集群将副本提升为新的主分片。
    在这里插入图片描述

扩展

ELK=elasticsearch+Logstash+kibana
elasticsearch:后台分布式存储以及全文检索
logstash: 日志加工、“搬运工”
kibana:数据可视化展示(跟head类似)。
ELK架构为数据分布式存储、可视化查询和日志解析创建了一个功能强大的管理链。 三者相互配合,取长补短,共同完成分布式大数据处理工作

  • curl 以命令的方式执行http协议的请求 GET/POST/PUT/DELETE
    curl -X GET/POST/PUT/DELETE URL
  • 分词器
    从一串文本中切出一个个的词条,并对每个词条进行标准化。

安装(jdk>=8)

1:官网下载解压:点我
2:创建logs和data文件夹
3:修改配置文件/xxx/elasticsearch-5.2.2/config/elasticsearch.yml
修改后的每行前面不能有空格,修改后的“:”后面必须有一个空格

# ---------------------------------- Cluster -----------------------------------
#如果集群两个节点上的cluster.name相同,都启动可以自动组成集群
cluster.name: my-application
# ------------------------------------ Node ------------------------------------
#集群内的各节点不能相同
node.name: node-1
# ----------------------------------- Paths ------------------------------------
path.data: /xxx/elasticsearch-5.2.2/data
path.logs: /xxx/elasticsearch-5.2.2/logs
# ----------------------------------- Memory -----------------------------------
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
# ---------------------------------- Network -----------------------------------
#远程访问用到
network.host: 192.168.1.102 
# --------------------------------- Discovery ----------------------------------
discovery.zen.ping.unicast.hosts: ["yeamin01"]

4:linux 系统环境配置

(1)切换到root用户,编辑limits.conf 添加类似如下内容
[root@hadoop102 elasticsearch-5.2.2]# vi /etc/security/limits.conf
添加如下内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
(2)切换到root用户,进入limits.d目录下修改配置文件。
[root@hadoop102 elasticsearch-5.2.2]# vi /etc/security/limits.d/90-nproc.conf
修改如下内容:
* soft nproc 1024
#修改为
* soft nproc 2048
(3)切换到root用户修改配置sysctl.conf
[root@hadoop102 elasticsearch-5.2.2]# vi /etc/sysctl.conf 
添加下面配置:
vm.max_map_count=655360
并执行命令:
[root@hadoop102 elasticsearch-5.2.2]# sysctl -p
然后,重新启动elasticsearch,即可启动成功。

Elasticsearch head插件安装

点击下载
nodejs官网下载安装包
下载nodejs
node-v6.9.2-linux-x64.tar.xz

配置nodejs环境变量
[root@xxx]# vi /etc/profile
export NODE_HOME=/opt/module/node-v6.9.2-linux-x64
export PATH= P A T H : PATH: PATH:NODE_HOME/bin
[root@xxx]# source /etc/profile

  • 解压head插件到/opt/module目录下
    [@xxx]$ unzip elasticsearch-head-master.zip -d /opt/module/
  • 查看当前head插件目录下有无node_modules/grunt目录:
    没有:执行命令创建:
    [@xxx]$ npm install grunt --save
  • 安装head插件:
    [@xxx]$ npm install -g cnpm --registry=https://registry.npm.taobao.org
  • 安装grunt:
    [@xxx]$ npm install -g grunt-cli
  • 编辑Gruntfile.js
    [@xxx]$ vim Gruntfile.js
    文件93行添加hostname:‘0.0.0.0’
    options: {
    hostname:‘0.0.0.0’,
    port: 9100,
    base: ‘.’,
    keepalive: true
    }
  • 检查head根目录下是否存在base文件夹
    没有:将 _site下的base文件夹及其内容复制到head根目录下
    [@xxx]$ mkdir base
    [@xxx]$ cp base/* …/base/
  • 启动grunt server:
    [@xxx]$ grunt server -d
    Running “connect:server” (connect) task
    [D] Task source: /opt/module/elasticsearch-head-master/node_modules/grunt-contrib-connect/tasks/connect.js
    Waiting forever…
    Started connect web server on http://localhost:9100

如果提示grunt的模块没有安装:
Local Npm module “grunt-contrib-clean” not found. Is it installed?
Local Npm module “grunt-contrib-concat” not found. Is it installed?
Local Npm module “grunt-contrib-watch” not found. Is it installed?
Local Npm module “grunt-contrib-connect” not found. Is it installed?
Local Npm module “grunt-contrib-copy” not found. Is it installed?
Local Npm module “grunt-contrib-jasmine” not found. Is it installed?
Warning: Task “connect:server” not found. Use –force to continue.
执行以下命令:

npm install grunt-contrib-clean -registry=https://registry.npm.taobao.org
npm install grunt-contrib-concat -registry=https://registry.npm.taobao.org
npm install grunt-contrib-watch -registry=https://registry.npm.taobao.org 
npm install grunt-contrib-connect -registry=https://registry.npm.taobao.org
npm install grunt-contrib-copy -registry=https://registry.npm.taobao.org 
npm install grunt-contrib-jasmine -registry=https://registry.npm.taobao.org

最后一个模块可能安装不成功,但是不影响使用。

  • http://ip:910015)启动集群插件后发现集群未连接
    在/opt/module/elasticsearch-5.2.2/config路径下修改配置文件elasticsearch.yml,在文件末尾增加
http.cors.enabled: true
http.cors.allow-origin: "*"

再重新启动elasticsearch。

Kibana的安装

注意:与安装的ES版本保持一致
kibana是一个针对ES的开源分析及可视化平台。使用kibana可以查询,查看并与存储在ES索引的数据进行交互操作,使用kibana能执行高级的数据分析,并能以图标和地图的形式查看数据。
1:下载
2:修改配置文件(kibana/config/kibana.yml)

#本机ip地址
server.host: "192.168.33.33"
#es所在的主机
elasticserch.url:"http://192.168.33.34:9200"

3:开启5601端口(kibana默认的端口)
开启防火墙:systemctl start firewalld.service
开启5601端口:firewall-cmd --permanent --zone=public --add -port=5601/tcp
重启防火墙:firewall -cmd --reload
4:启动kibana
./bin/kibana

安装中文分词器

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.1/elasticsearch-analysis-ik-6.4.1.zip
  • 解压,maven编译,将生成的zip报放到es插件的目录下,并且新建文件夹。
  • 解压所该zip包,并将生成的所有内容上移到自己新建的文件夹下。

对ES的基本操作

ES使用一种称为 倒排索引 的结构,它适用与快速的全文搜索,一个倒排索引由文档中的所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。

  • 新增
    PUT / 索引名称 /文档/id
  • 查询
    GET 索引名称/_settings
  • 修改
    PUT / 索引名称 /文档/id/_update
  • 删除
    DELETE

使用multiGet批量获取文档

GET  /索引/文档/_mget
{    "ids":["1","2"]
}

使用Bulk API实现批量操作(获取和删除)

bulk的格式:{action:{metadata}}\n
                     {requestbody}\n
action:
  • create:文档不存在时创建(已经存在,则报错)
  • update:更新文档
  • index:创建新文档或者替换已有的文档
  • delete:删除一个文档
metadata

_index、_type、_id

例子:{“delete”:{"_index":“db”,"_type":“table”,"_id":“id”}}
POST /lib2/books/_bulk
{“index”:{"_id":“1”}}
{“title”:“java”}

mapping

  • 支持的数据类型:string:可分为text和keyword
    text 类型被用来索引长文本,在建立索引前会将这些文本进行分词,text类型不能用来排序和聚合,keyword类型不需要进行分词,可以用来检索过滤,排序和集合。

  • 数字型:long,integer,short,byte,double,float

  • 日期:date

  • 布尔型:boolean

  • 二进制型:binary

基本查询(query)

  • GET /index/type/_search?q=name:lisi&sort=age :desc
  • term:不知道分词器的存在 ,适合查询keyword,numeric.date类型,中文的话包含该字就会被查询出来
    terms:查询某个字段里含有多个关键词的文档(含有其中一个也会被查询出来)
 GET /index/type/_search/
 { "query":{
           "term":{"name":"lisi"}
            }
 }
 
 GET /index/type/_search/
 { "query":{
           "terms":{"content":["this","paper"]}
           }
 }
 
 GET /index/type/_search/
 {"from":0,
  "size":2,
  "query":{
           "terms":{"content":["the","book"]}
          }
 }
  • match: 知道分词器的存在,会对filed进行分词操作,然后再查询
 GET /index/type/_search/
 { "query":{
           "match":{"name":"lisi zhaoliu"}
            }
 }
查询所有:
 GET /index/type/_search/
 { "query":{
           "match_all":{}
            }
 } 
查询多个字段:
 GET /index/type/_search/
 { "query":{
           "multi_match":{
                          "query": "singing" ,
                          "fields":["interests","name"]  }
            }
 } 
 指定返回的字段:
  GET /index/type/_search/
 { "_source":["address","name"]
   "query":{
           "match":{
                    "name":"lisi"}
            }
 }
  • sort排序:
 GET /index/type/_search/
 { "query":{
           "match_all":{}
            },
      "sort":[
      {
         "age":{
         "order":"desc"
               }
      }
              ]
 } 
前缀匹配:
 GET /index/type/_search/
 { "query":{
           "match_phrase_prefix":{
                               "name":{
                                    "query": "zhao"
                                      }
                                 }
             }
 }
范围查询:
 GET /index/type/_search/
 { "query":{
           "range":{
                               "birthday":{
                                    "from": "1999-1-1",
                                    "to": "1999-12-29",
                                    "include_lower":true,
                                    "include_upper":false
                                      }
                                 }
             }
 }
 wildcard 查询 允许使用通配符*(任意多个) 和?(一个字符):
  GET /index/type/_search/
 { "query":{
           "wildcard":{
                               "name":"zhao*",
                               "intering":"foot?all"
                                 }
             }
 }
fuzzy 实现模糊查询:
 GET /index/type/_search/
 { "query":{
           "fuzzy":{"name":"zhaliu"}
             }
 }
filter查询是不计算相关性的可以使用缓存 所以查询比query快
 GET /index/type/_search/
 { "query":{
           "bool":{
                   "filter":[
                   "term":{"price":40}
                            ]
                   }
             }
 }

 GET /index/type/_search/
 { "query":{
           "bool":{
                   "filter":[
                   "terms":{"price":[5,20]}
                            ]
                                 }
             }
 }

多线程冲突解决

es内部使用乐观所来解决多线程冲突,最多尝试次数是我们指定retry_on_conflit的值

POST /index/type/id/_update?retry_on_conflit=3

其他文档:
代码层次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值