一、Elasticsearch介绍
1.Elasticsearch产生背景
- 大数据量的检索
 - NoSql: not only sql,泛指非关系型的数据库
 - Nginx的7层负载均衡和4层负载均衡
 
2.Elasticsearch是什么
 一个基于Lucene的分布式搜索和分析引擎,一个开源的高扩展的分布式全文检索引擎
 Elasticsearch使用Java开发:需安装jdk
Apache:
-  
公司:开源协议
在它的条款下开源
很多主流的开源软件都捐献给Apache,让它维护
顶级开源项目:Kafka,ES,Echarts -  
Apache服务器:Web服务器(Nginx)
是当前流行的企业级搜索引擎:稳定可靠,企业里普遍使用
使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,使得全文检索变得简单 
Lucene与Elasticsearch关系:
- Lucene是个库,只能Java使用,并且复杂
 - Elasticsearch,使用Restful操作
 
Elasticsearch与solr:
- mysql和oracle的关系
都是分布式的搜索引擎,不是一个软件,核心本质一样 - solr基于Lucene
 - es集成度高,solr需要更多插件支持
 - Solr是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用
 
3.核心概念
 集群:多太ES服务器的配合使用的集合称为集群。
 节点:形成集群的每个服务器称为节点。
 
 Shard:分片,数据可以分为较小的分片。每个分片放到不同的服务器上。
 Replia:副本,为提高查询吞吐量或实现高可用性,副本是一个分片的精确复制,每个分片可以有零个或多个副本。
 全文检索:在一篇文档中搜索要的内容,如果想查的数据快,肯定不是基于mysql的那种索引方式—基于倒排索引,实现的全文检索。
4.ES与关系型数据库Mysql对比
| Mysql | ES | 
|---|---|
| 数据库 | 索引 | 
| 表 | 类型 | 
| 行 | 文档 | 
| 建表语句 | 映射 | 

5.物理设计
 一个集群包含至少一个节点,而一个节点就是一个elasticsearch进程。节点内可以有多个索引。
 默认的,如果你创建一个索引,那么这个索引将会有5个分片(primary shard,又称主分片)构成,而每个分片又有一个副本(replica shard,又称复制分片),这样,就有了10个分片。
6.ELK是什么
 是日志收集和分析系统。
ELK=elasticsearch+Logstash+kibana
 elasticsearch:后台分布式存储以及全文检索
 logstash: 日志加工、“搬运工”
 kibana:数据可视化展示
ELK架构为数据分布式存储、可视化查询和日志解析创建了一个功能强大的管理链。 三者相互配合,取长补短,共同完成分布式大数据处理工作。
7.业务场景
- 搜索功能
 - ES来替代传统的NoSQL,它的横向扩展机制太方便了
 
8.Elasticsearch索引到底能处理多大数据
 一个Lucene索引,不能处理多于21亿篇文档,或者多于2740亿的唯一词条
 一个分片是一个lucene索引,一个es索引默认5个分片
二、Elasticsearch安装
ES安装:
 安装jdk(java开发的)---->官网下载,解压---->启动即可(bin目录下bat文件)
 在浏览器输入:http://127.0.0.1:9200/
ES客户端安装:
 1.restful接口---->直接使用浏览器就可以访问
2.官方没有提供一个特别好的客户端
- postman
 - elasticsearch-head(第三方,node写的:node环境)
 
# 安装
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
# 启动
npm run start
 
配置跨域:修改es的配置
http.cors.enabled: true
http.cors.allow-origin: "*"
 
浏览器输入:http://localhost:9100/
- Kibana(官方提供的)
ES和Kibana版本要严格对应
官网下载,解压即可
修改配置—>连接es的地址: 
server.port: 5601
server.host: "127.0.0.1"
server.name: lqz
elasticsearch.hosts: ["http://localhost:9200/"]
 
bin路径下启动kibana
 浏览器访问:http://localhost:5601
三、倒排索引
由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而成为倒排索引。
 反向索引又叫倒排索引,是根据文章内容中的关键字建立索引。
 对文章内容进行分词,根据分词建立索引(出现的位置和出现的次数)。
四、索引操作
索引等同于mysql中的数据库
- 在5.x(包含)之前,一个索引下可以建立多个映射(表)
 - 6.x后,一个索引下只能建立一个映射(表),之前5.x的查询还能用
 - 7.x后,一个索引下完全只支持一个映射
 
haystack:django的app,实现全文检索
- 底层可以基于 whoosh(python写的,类似于sqlite,文档型的),ES(Java,类似于Mysql,互联网公司用的多),solr(Java,类似于Oracle,传统企业用)
 - 年久失修,只支持es 2.x版本
 - 咱们做全文检索,基于es,自己通过python操作
 
配置信息增删改查:
# 增
PUT lqz2
{
   
  "settings": {
   
    "index":{
   
      "number_of_shards":5,
      "number_of_replicas":1
    }
  }
}
# 删
DELETE lqz
# 查 
# 获取lqz2索引的配置信息
GET lqz2/_settings
#获取所有索引的配置信息
GET _all/_settings
# 同上
GET _settings
# 获取lqz和lqz2索引的配置信息
GET lqz,lqz2/_settings
# 改(一般不改)
PUT lqz/_settings
{
   
  "number_of_replicas": 1
}
 
五、映射管理
在Elasticsearch 6.0.0或更高版本中创建的索引只包含一个mapping type。
 在5.x中使用multiple mapping types创建的索引将继续像以前一样在Elasticsearch 6.x中运行。
 Mapping types将在Elasticsearch 7.0.0中完全删除。
在创建索引的时候,可以预先定义字段的类型及相关属性,如果没有设置,es会自动设置。
Mapping是我们自己定义的字段数据类型,同时告诉es如何索引数据及是否可以被搜索。
 作用:会让索引建立的更加细致和完善
字段及类型:
- 字符串类型:text(会分词),keyword(不会分词)
 - 数字类型:long,integer,short,byte double,float
 - 日期类型:data
 - 布尔类型:boolean
 - binary类型:binary
 - 复杂类型:object(实体,对象),nested(列表)
 - geo类型:geo-point,geo-shape(地理位置)----redis中
 - 专业类型:ip,competion(搜索建议)
 
建立映射:
PUT books
{
   
  "mappings": {
   
    "properties":{
   
      "title":{
   
        "type":"text"
      },
      "price":{
   
        "type":"integer"
      },
      "addr":{
   
        "type":"keyword"
      },
      "company":{
   
        "properties":{
   
          "name":{
   "type":"text"}
                


















