ElasticSearch

1、ElasticSearch相关概念

1.1、什么是ES

​     ES是一个分布式的全文搜索引擎,为了解决原生Lucene使用的不足,优化Lucene的调用方式,并实现了高可用的分布式集群的搜索方案,ES的索引库管理支持依然是基于Apache Lucene™的开源搜索引擎。
​     ES也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API来隐Lucene的复杂性,从而让全文搜索变得简单。

1.2、特点

  • 基于lucene
  • 使用简单
  • 分布式的
  • 基于Restful API(http)
  • 支持各种客户端(java,php。。)
  • PB级别数据
  • 性能好,速度高(近实时)
  • 支持集群
  • 处理json格式的数据

1.3、ES和lucene的区别

Lucene:

  • 只支持Java
  • 非分布式的,索引目录只能在本地
  • 使用非常复杂
  • 小项目使用

1.4、ES的相关概念

1.4.1.Near Realtime(NRT)

    近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级

1.4.2.Index:索引库

    包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。

1.4.3.Type:类型

    每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。

1.4.4.Document&field

    文档,es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。

1.4.5.Cluster:集群

    包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常

1.4.6.Node:节点

    集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为"elasticsearch"的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群

1.4.7.shard(分片)

    单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个shard都是一个lucene index。

1.4.8.replica(复制品)

    任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个),默认每个索引10个shard,5个primary shard,5个replica shard,最小的高可用配置,是2台服务器。

1.4.9.集群原理图

在这里插入图片描述

2、ElasticSearch的安装

2.1.ElasticSearch安装

2.1.1.下载

官网:
https://www.elastic.co/downloads/elasticsearch

2.1.2.安装

​ 解压即可

2.1.3.测试

访问:http://localhost:9200
在这里插入图片描述

2.2.可视化工具安装
2.2.1.Kibana5安装(下面使用这个用来演示,header的界面比较丑)
1.下载

https://www.elastic.co/downloads/kibana

2.配置

​     解压并编辑config/kibana.yml,设置elasticsearch.url的值为已启动的ES

3.启动Kibana5

​     bin\kibana.bat

4.默认访问地址

​     http://localhost:5601
在这里插入图片描述

2.2.2.elasticsearch-header
1.下载

     https://github.com/mobz/elasticsearch-head/releases

2.安装

     npm install

3.运行

    npm run start

4.配置跨域

    修改 elasticsearch/config/elasticsearch.yml

  • http.cors.enabled: true
  • http.cors.allow-origin: “*”
2.3.分词器安装

    ES默认对英文文本的分词器支持较好,但和lucene一样,如果需要对中文进行全文检索,那么需要使用中文分词器,同lucene一样,在使用中文全文检索前,需要集成IK分词器。

  • 下载IK分词器

    ​     ES的IK分词器插件源码地址:https://github.com/medcl/elasticsearch-analysis-ik

  • 解压elasticsearch-analysis-ik-5.2.2.zip文件

    ​ 并将其内容放置于ES根目录/plugins/ik

  • IK分词器配置

  • IK分词测试

    POST _analyze
    {
      "analyzer":"ik_smart",
      "text":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
    }
    

    IK分词器指定:ik_smart ; ik_max_word。
    ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。
    ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;

3.RestFull风格

3.1.基本定义
3.1.1.什么是Restfull

​ Restful是一种面向资源的架构风格,可以简单理解为:使用URL定位资源,用HTTP动(GET,POST,DELETE,PUT)描述操作。

3.1.2.Restful的好处
  • 透明性,暴露资源存在。
  • 充分利用 HTTP 协议本身语义。(GET POST DELETE POST PUT)
  • 无状态,这点非常重要。在调用一个接口(访问、操作资源)的时候,可以不用考虑上下文,不用考虑当前状态,极大的降低了复杂度。
3.1.3.Restfull的特点
  • 资源(URL)使用名词表示
  • 使用http动词来描述操作
3.2.案例
3.2.1.获取资源
  • GET /user/1 => 获取id为1的用户
  • GET /users => 获取用户列表
3.2.2.添加数据
  • PUT /user => 添加用户

    {“id”:“1”,“username”:“zs”}

3.2.4.修改
  • POST /user

    {“id”:“1”,“username”:“zs”}

3.2.3.删除资源
  • DELELE /user/1 => 删除id为1的用户

4.ElasticSearch文档的CRUD

4.1、文档的概念

ESMysql
_index(索引库)数据库
_type(文档类型)
_document(文档对象)一行数据
_id(文档ID)主键ID
field(字段)

其他

_source(文档原始数据-就是保存在ES中的真实数据)
_all(所有字段的连接字符串)
metadata(文档元数据-除去文档真实数据意外的其他数据)

4.2、添加文档

语法

PUT 索引库/文档类型/文档id
{
	文档原始数据
}

例如:
在这里插入图片描述
注意,如果文档ID不填写,会默认生成一个ID,并且需要用post关键字
在这里插入图片描述

4.3、查询文档

4.3.1、获取指定文档

GET 索引库/类型/文档ID
在这里插入图片描述

4.3.2、指定返回的列

GET /ssm/employee/1?_source=username
GET /ssm/employee/1/_source
在这里插入图片描述
在这里插入图片描述

4.3.3、查询所有
GET _search
4.3.4、查询指定索引库
GET ssm/_search
4.3.5、查询指定类型
GET ssm/employee/_search
4.3.6、分页查询
GET ssm/employee/_search?size=2&from=2
4.3.7、字符串查询

条件查询+分页+排序

GET ssm/employee/_search?q=age:17&size=2&from=2&sort=id:desc&_source=id,username

字符串查询(query string)其实就是在url后面以字符串的方式拼接各种查询条件,这种方式不推荐,因为条件过多,拼接起来比较麻烦

4.3.8、批量查询

批量查询很重要,对相比单个查询来说,批量查询性能更高。

不同索引库查询
在这里插入图片描述
同索引库同类型 - 推荐
在这里插入图片描述

4.4、修改文档

4.4.1、整体修改
PUT {index}/{type}/{id}
{
	修改后的内容
}

在这里插入图片描述
在这里插入图片描述
注意:整体修改的语法跟添加文档语法一样,如果文档已经存在就是添加,否则就是修改,
文档修改过程:1.标记删除旧文档,2.添加新文档

4.4.2、局部修改
POST /ssm/employee/1/_update
{
  "doc":{
    "username":"xg2"
  }
}

在这里插入图片描述
在这里插入图片描述

4.3、删除文档

DELETE {index}/{type}/{id}

在这里插入图片描述

5、DSL查询与DSL过滤

5.1、基本概念

5.1.1、定义

    DSL过滤语句和DSL查询语句非常相似,但是它们的使用目的却不同:DSL过滤查询文档的方式更像是对于我的条件"有"或者"没有"(等于 ;不等于),而DSL查询语句则像是"有多像"(模糊查询)。

5.1.1、查询与过滤的区别

DSL过滤和DSL查询在性能上的区别:

  • 过滤结果可以缓存并应用到后续请求。-> 精确过滤后的结果拿去模糊查询性能高
  • 查询语句同时匹配文档,计算相关性,所以更耗时,且不缓存。
  • 过滤语句可有效地配合查询语句完成文档过滤。

总结:需要模糊查询的使用DSL查询 ,需要精确查询的使用DSL过滤,在开发中组合使用(组合查询) -> 关键字查询使用DSL查询,其他的都是用DSL过滤。

5.2.练习

5.2.1、练习1
GET ssm/employee/_search
{
    "query": {
       "bool": { 
              "must": [
                	{"match": {"description": "search" }}
               ],
               "filter": {
                   "term": {"tags": "lucene"}
               }
        }
    },
    "from": 20, 
    "size": 10,
    "_source": ["fullName", "age", "email"],
    "sort": [{"join_date": "desc"},{"age": "asc"}]
}

query : 查询

bool : 组合查询 , 包含了 DSL查询和DSL过滤

must : 必须匹配 :与(must) 或(should) 非(must_not)

match:分词匹配查询,会对查询条件分词 , multi_match :多字段匹配

filter: 过滤条件

term:词元查询,不会对查询条件分词

from,size :分页

_source :查询结果中需要哪些列

sort:排序
在这里插入图片描述

6、文档映射

6.1.基本概念

6.1.1.什么是文档映射

​ ES的文档映射(mapping)机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型。

  • Mysql建表过程:创建数据库 -> 创建表(指定字段类型) -> crud数据
  • ES创建索引过程:创建索引库 -> 文档类型映射 -> crud文档
  • 映射与分词 : 为了方便字段的检索,我么会对某些存储在ES中的字段进行分词,但是有些字段类型可以分词,有些字段类型不可以分词,所以对于字段的类型需要我们自己去指定。
6.1.2.默认的字段类型

查看索引类型的映射配置:GET {indexName}/_mapping/{typeName}

基本字段类型

  • 字符串

    text(分词), keyword(不分词) ,StringField(不分词文本),TextFiled(要分词文本) ,text默认为全文文本,keyword默认为非全文文本

  • 数字(long,integer,short,double,float)

  • 日期date

  • 逻辑boolean

复杂字段类型

  • 对象类型:object
  • 数组类型:array
  • 地理位置:geo_point,geo_shape

默认映射

ES在没有配置Mapping的情况下新增文档,ES会尝试对字段类型进行猜测,并动态生成字段和类型的映射关系。

JSON typeField type
Boolean: true or false“boolean”
Whole number: 123“long”
Floating point: 123.45“double”
String, valid date:“2014-09-15”“date”
String: “foo bar”“string”
6.1.3.映射规则

字段映射的常用属性配置列表 - 即给某个字段执行类的时候可以指定以下属性

属性名解释
type字段的类型:基本数据类型,integer,long,date,boolean,keyword,text…
enable是否启用:默认为true。 false:不能索引、不能搜索过滤。
boost权重提升倍数:用于查询时加权计算最终的得分,比如标题中搜索到的内容比简介中搜索到的内容跟重要,那么可以提升
index索引模式:analyzed (索引并分词,text默认模式), not_analyzed (索引不分词,keyword默认模式),no(不索引)
analyzer索引分词器:索引创建时使用的分词器,如ik_smart,ik_max_word,standard
search_analyzer搜索分词器:搜索该字段的值时,传入的查询内容的分词器。
fields多字段索引:当对该字段需要使用多种索引模式时使用。如:城市搜索New York"city":
"city":{  
	"type": "text",   
	"analyzer": "ik_smart",   
	"fields": {      
		"raw": {         
			"type":  "keyword"       
		}   
	}
}

解释:相当于给 city取了一个别名 city.raw,city的类型为text , city.raw的类型为 keyword
搜索 city分词 ; 搜索city.raw 不分词那么以后搜索过滤和排序就可以使用city.raw字段名

6.2.添加映射

注意:如果索引库已经有数据了,就不能再添加映射了

6.2.1.创建新的索引库
put xl
6.2.2.单类型创建映射
PUT /xl/menu/_mapping
{
  "menu":{
    "properties":{
       "id":{
         "type":"long"
       },
       "name":{
         "type":"text",
         "analyzer":"ik_smart",
         "search_analyzer": "ik_smart"
       }
    
    }
    
  }
  
}

解释:给xl索引库中的是menu类型创建映射 ,id指定为long类型 , name指定为text类型(要分词),analyzer分词使用ik,查询分词器也使用ik
在这里插入图片描述

6.2.3.多类型创建映射
PUT aigou
{
  "mappings": {
    "user": {
      "properties": {
        "id": {
          "type": "integer"
        },
        "info": {
          "type": "text",
          "analyzer": "ik_smart",
          "search_analyzer": "ik_smart"
        }
      }
    },
    "dept": {
      "properties": {
        "id": {
          "type": "integer"
        },
        ....更多字段映射配置
      }
    }
  }
}

解释:同时给user和dept创建文档映射

6.3.数组/对象映射

基本类型字段映射非常简单,直接配置对应的类型即可,但是数组和对象如何指定类型呢?

6.3.1.对象映射
{
  "id" : 1,
  "girl" : {
      "name" : "huahua",
      "age"  : 22
  }
}

文档映射

{ 
  "properties": {
       "id": {"type": "long"},
       "girl": {
           "properties":{
           		"name": {"type": "keyword"},
           		"age": {"type": "integer"}
           }
        }
  }
}
6.3.2.数组映射
{
	"id" : 1,
	"hobby" : ["huahua","caocao"]
}

文档映射

{ 
		"properties": {
            "id": {"type": "long"},
            "hobby": {"type": "keyword"}
     }
}

解释:数组的映射只需要映射一个元素即可,因为数组中的元素类型是一样的。

6.3.3.对象数组
{
	"id" : 1,
	"girl":[{"name":"huahua","age":22},{"name":"caocoa","age":22}]
}

文档映射

"properties": {
        "id": {
            "type": "long"
        },
        "girl": {
            "properties": {
              "age": { "type": "long" },
              "name": { "type": "text" }
            }
        }
}

6.4.全局映射

索引库中多个类型(表)的字段是有相同的映射,如所有的ID都可以指定为integer类型,基于这种思想,我们可以做全局映射,让所有的文档都使用全局文档映射。全局映射可以通过动态模板和默认设置两种方式实现。

6.4.1.默认方式:default

索引下所有的类型映射配置会继承_default_的配置,如:

PUT {indexName}
{
 "mappings": {
    "_default_": { 
       "_all": {
        	"enabled": false
       }
  },
  "user": {}, 
  "dept": { 
     "_all": {
      	"enabled": true
     }
  }
 }

关闭默认的 _all ,dept自定义开启 all

6.4.2.动态模板

dynamic_templates

PUT _template/global_template  //创建名为global_template的模板
{
  "template":   "*",  //匹配所有索引库
  "settings": { "number_of_shards": 1 }, //匹配到的索引库只创建1个主分片
  "mappings": {
    "_default_": {
      "_all": { 
        "enabled": false //关闭所有类型的_all字段
      },
      "dynamic_templates": [
        {
          "string_as_text": { 
            "match_mapping_type": "string",//匹配类型string
            "match":   "*_text", //匹配字段名字以_text结尾
            "mapping": {
              "type": "text",//将类型为string的字段映射为text类型
              "analyzer": "ik_max_word",
              "search_analyzer": "ik_max_word",
              "fields": {
                "raw": {
                  "type":  "keyword",
                  "ignore_above": 256
                }
              }
            }
          }
        },
        {
          "string_as_keyword": { 
            "match_mapping_type": "string",//匹配类型string
            "mapping": {
              "type": "keyword"//将类型为string的字段映射为keyword类型
             }
          }
        }
      ]
    }
  }}

PS : 映射方式优先级 (低 -> 高):默认 -> 全局 -> 自定义

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值