1 概述
1.1 简介
ElasticSearch是一个基于Lucene的全文搜索服务器。它提供了一个分布式集群,多用户能力的全文搜索引擎 , 基于RESTful web接口 , 以使全文搜索变得简单易用
1.2 特点
- 分布式全文搜索引擎
- 可以在在分布式项目或集群中使用
- 本身支持集群扩展
- 处理PB级结构化或非结构化数据
- 简单的RESTful API通信方式
- 支持各种语言的客户端
- 基于Lucene封装,使操作简单
1.3 lucene与ES区别
- lucene只支持java语言,ES支持多种语言
- lucene不支持分布式,索引目录仅在本地
- lucene使用复杂
- lucene只适合小型项目使用
1.4 有关概念
- cluster:代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
- shards:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。每个shard都是一个lucene index
- replica:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个),默认每个索引10个shard,5个primary shard,5个replica shard,最小的高可用配置,是2台服务器。
- recovery:代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配 ; 挂掉的节点重新启动时会先进行本地数据恢复然后再从原来的从节点进行恢复,然后成为新的从节点,原从节点成为主节点。
- Transport:代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。
2 ES安装
2.1 下载
下载地址
运行 %ES_HOME%\bin\elasticsearch.bat即可运行ES服务器
输入url http://localhost:9200/
2.2 安装分词器
在启动ES前将分词器解压至plugins文件夹下
- 例:
ES的IK分词器插件源码地址:https://github.com/medcl/elasticsearch-analysis-ik 解压elasticsearch-analysis-ik-5.2.2.zip文件 - 测试
POST _analyze
{
"analyzer":"ik_smart",
"text":"《新闻联播》播发国际锐评:打“香港牌”牵制中国的图谋必败无疑"
}
IK分词器指定:ik_smart(智能模式) ; ik_max_word(最大细粒度)
2.3 可视化工具kibana安装
下载地址
解压并编辑config/kibana.yml,设置elasticsearch.url的host为已启动的ES(一般默认9200)
启动 打开bin\kibana.bat 访问地址http://localhost:5601
- Discover:可视化查询分析器
- Visualize:统计分析图表
- Dashboard:自定义主面板(添加图表)
- Timelion:Timelion是一个kibana时间序列展示组件(暂时不用)
- Dev Tools :Console(同CURL/POSTER,操作ES代码工具,拥有代码提示,很方便)
- Management:管理索引库(index)、已保存的搜索和可视化结果(save
objects)、设置 kibana 服务器属性。
3 ES的RESTful风格
3.1 概述
RESTful是一种面向资源的架构风格,可以简单理解为:使用URL定位资源,用HTTP动词(GET,POST,DELETE,PUT)描述操作。
3.2 优点
- 透明性,暴露资源存在。
- 充分利用 HTTP 协议本身语义。
- 无状态,这点非常重要。在调用一个接口(访问、操作资源)的时候,可以不用考虑上下文,不用考虑当前- - 状态,极大的降低了复杂度。
- HTTP 本身提供了丰富的内容协商手段,无论是缓存,还是资源修改的乐观并发控制,都可以以业务无关的中间件来实现。
3.3 示例
- 获取资源
GET /user/1
=> 获取id为1的用户
GET /users
=> 获取用户列表 - 添加数据
PUT /user
=> 添加用户 数据:{“id”:“1”,“name”:“cc”} - 修改
POST /user
数据{“id”:“1”,“name”:“cc”} - 删除资源
DELELE /user/1
=> 删除id为1的用户 -
4 操作ES
4.1 索引库index的CRUD
4.1.1 添加索引库
PUT crm
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
}
}
4.1.2 查看索引库
- 查看所有索引库
GET _cat/indices?v
- 查看指定索引库
GET _cat/indices/crm?v
4.1.3 修改索引库
通过删除后再次添加
4.1.4 删除索引库
DELETE crm
4.2 文档document的CRUD
4.2.1 关键字详解
- _index 索引库 --> crm
- _type 类型 --> t_employee
- _document 文档 --> employee对象
- _id --> 文档的id 一般与数据的id一致
- _filed 字段 --> username字段
- _source -->文档的原始数据,我们保存的数据就在这里
- _all --> 所有字段的连接字符串
- metadata --> 文档元数据,初始的一些数据
4.2.2 添加文档
PUT crm/employee/1
{
"id":1,
"name":"cc",
"sex":true
}
如不指定路径上的id,ES会自动生成一个id字符串
4.2.3 查询文档
- 查询所有索引库/指定索引库的所有文档 在后面加上_search
- 查询指定的文档的全部字段
GET crm/employee/1
- 查询指定文档的指定字段
GET crm/employee/1?_source=name,sex
- 查询所有文档
GET crm/employee/_search
4.2.4 修改文档
- 整体修改
操作语法相当于添加
PUT crm/employee/2
{
"id":2,
"name":"aabbcc",
"sex":true
}
- 局部修改
POST crm/employee/2/_update
{
"doc": {
"sex":false
}
}
4.2.5 删除文档
DELETE crm/employee/2
4.3 文档的高级查询
4.3.1 批量查询
- 不同索引库批量查询
GET _mget
{
"docs":[
{
"_index":"crm",
"_type":"employee",
"_id":"1"
},{
"_index":"cms",
"_type":"user",
"_id":"1"
}
]
}
- 相同索引库相同类型查询
GET crm/employee/_mget
{
"ids":["1","2"]
}
4.3.2 分页查询及高级搜索
GET crm/user/_search?q=age:17&size=2&from=2&sort=id:desc&_source=id,username
此方式不推荐,因条件过多,拼起来较麻烦,后面会使用下面的方式.
4.4 DSL查询与DSL过滤
DSL查询相当于模糊查询;DSL过滤相当于精确匹配;
ES底层优先使用DSL过滤再使用DSL查询,以达到高效目的;
一般我们会将两者进行结合起来使用:
GET crm/employee/_search
{
"query":{
"bool": {
"must": [
{
"match": {
"name": "carry"
}}
],
"filter": [{
"term": {
"sex": true
}},
{
"range":{
"id":{
"gte":1,
"lte":7
}
}
}]
}
},
"from": 0,
"size": 10,
"_source": ["name","sex"],
"sort": [{
"id": "desc"}]
}
关键字 :
- bool : 组合查询 , 包含了 DSL查询和DSL过滤
- must : 必须匹配 :与(must) 或(should) 非(must_not)
- match:分词匹配查询,会对查询条件分词 , multi_match :多字段匹配
- term:词元查询,不会对查询条件分词
- range : 查询范围
-
4.5 文档的映射
ES的文档映射(mapping)机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型。
4.5.1 映射字段类型
① 基本字段类型
字符串:text(分词),keyword(不分词) StringField(不分词文本),TextFiled(要分词文本)
text默认为全文文本,keyword默认为非全文文本
数字:long,integer,short,double,float
日期:date
逻辑:boolean
② 复杂数据类型
对象类型:object
数组类型:array
地理位置:geo_point,geo_shape
4.5.2 默认映射
json类型 ==> ES字段类型
Boolean ==> boolean
整数 ==> long
小数 ==> double
日期字符串 ==> date
String ==> string
4.5.3 字段映射的常用属性配置列表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Czn5