1.概念
ES即为了解决原生Lucene使用的不足,优化Lucene的调用方式,并实现了高可用的分布式集群的搜索方案,其第一个版本于2010年2月出现在GitHub上并迅速成为最受欢迎的项目之一。
首先,ES的索引库管理支持依然是基于Apache Lucene(TM)的开源搜索引擎。
ES也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
ES的核心不在于Lucene,其特点更多的体现为:
分布式的实时文件存储,每个字段都被索引并可被搜索
分布式的实时分析搜索引擎
可以扩展到上百台服务器,处理PB级结构化或非结构化数据
高度集成化的服务,你的应用可以通过简单的 RESTful API、各种语言的客户端甚至命令行与之交互。
2.es区别于lucene
Lucene和ES联系,区别:项目中为啥使用ES而不用Lucene.
联系:ElasticSearch封装了Lucene,让使用变得更简单,在高可用上面做得更好。
区别:ElasticSearch除了拥有Lucene所有优点以外,还拥有自己优点.
可用性:支持集群没有单点故障
扩展性:支持集群扩展
在集群环境使用:
ElasticSearch
搜索引擎服务器,所有项目都统一访问索引服务器,可以支持在集群环境使用.
Lucene 搜索引擎工具包,必须集成到项目中使用,而在集群环境下,多个服务器都有自己Lucene文件,所以不统一. 不支持在集群环境使用
支持多种语言:ElasticSearch支持很多语言,Lucene支持java
简单性:ElasticSearch简单,都是http请求而Lucene复杂,都要调用API执行一大堆操作
一般lucene在中小型项目中使用(但是也能使用es),而ES在大型项目中使用.因为ES支持在集群环境使用,并且自身也支持集群.
3.三大全文
luncene/es/solr
Solr和ES比较:
Solr 利用 Zookeeper 进行分布式管理,支持更多格式的数据(HTML/PDF/CSV),官方提供的功能更多在传统的搜索应用中表现好于 ES,但实时搜索效率低。
ES自身带有分布式协调管理功能,但仅支持json文件格式,本身更注重于核心功能,高级功能多有第三方插件提供,在处理实时搜索应用时效率明显高于 Solr。
4.es的安装
官方下载地址:https://www.elastic.co/downloads/elasticsearch
安装运行
修改jvm.options
运行
访问测试
ES集群已经启动并且正常运行.
5.客户端
客户端可以分为图形界面客户端,和代码客户端.
辅助管理工具Kibana5
① Kibana5.2.2下载地址:https://www.elastic.co/downloads/kibana
② 解压并编辑config/kibana.yml,设置elasticsearch.url的值为已启动的ES
③ 启动Kibana5 : bin\kibana.bat
④ 默认访问地址:http://localhost:5601
Discover:可视化查询分析器
Visualize:统计分析图表
Dashboard:自定义主面板(添加图表)
Timelion:Timelion是一个kibana时间序列展示组件(暂时不用)
Dev Tools :Console(同CURL/POSTER,操作ES代码工具,代码提示,很方便)
Management:管理索引库(index)、已保存的搜索和可视化结果(save objects)、设置 kibana 服务器属性。
启动运行访问
6.es的数据管理
--es的文档
ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。
_index:索引库,类似于关系型数据库里的“数据库”—它是我们存储和索引关联数据的地方。
_type:类型,类似于关系型数据库中表.在应用中,我们使用对象表示一些“事物”,例如一个用户、一篇博客、一个评论,或者一封邮件。可以是大写或小写,不能包含下划线或逗号。我们将使用 employee 做为类型名。
_id:与 _index 和 _type 组合时,就可以在ELasticsearch中唯一标识一个文档。当创建一个文档,你可以自定义 _id ,也可以让Elasticsearch帮你自动生成。
另外还包括:_uid文档唯一标识(_type#_id)
_source:文档原始数据
_all:所有字段的连接字符串
--基本操作
添加
PUT dms/emp/1
{
"id":1,
"name":"sss",
"age":13
}
查询
get dms/emp/_search
自定义id
POST dms/emp/
{
"id":2,
"name":"sss2",
"age":13
}
#2:修改:a:先删除再插入
PUT crm/emp/1
{
"id":1,
"name":"ads",
"age":18
}
#2:修改:b:局部修改
POST crm/emp/AWmjggiFZPiESvqs-mqR/_update
{
"doc": {
"id":1,
"name":"xxx",
"age":17
}
}
#3:删除:a:指定一个document删除
DELETE dms/emp/1
#3:删除:b:删除整个索引,删库
DELETE dms
# 4:查询:a:指定一个document的id查询
GET dms/emp/1
# 4:查询:b:指定一个document的id查询,只需要返回数据:source
GET dms/emp/1/_source
# 4:查询:c:指定一个document的id查询,只需要返回指定key的数据:只返回source的name的值
GET dms/emp/1/_source?_source=name
#5.1不同索引不同类型的数据
GET _mget
{
"docs":[
{
"_index":"dms",
"_type":"emp",
"_id":"1"
},{
"_index":"dms",
"_type":"emp",
"_id":"2"
}
]
}
#5.2:同一个索引和类型
GET dms/emp/_mget
{
"ids":[1,2,3]
}
#6.1: 查询所有的索引数据
GET _search
#6.2:指定索引和分类的查询
GET dms/emp/_search
#size :每页多少条 默认是10; from:从哪里开始,默认从0开始
GET dms/emp/_search?size=2&from=1
字符串查询
GET dms/emp/_search?q=age:11
es的查询:TO必须大写;多个条件使用&拼接;排序:默认是升序asc
GET dms/emp/_search?q=age[10 TO 13]&sort=id:desc&size=2&from=0
6.dsl查询与过滤
-- 什么是DSL查询
由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。
DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现
查询字符串模式:GET dms/emp/_search?q=name:文兵 简单查询
DSL模式: 复杂查询
GET dms/emp/_search
{
"query" : {
"match" : {
"name" : "sss"
}
}
}
7.分词与映射
1) 集成合适分词器-ik
在服务端通过插件集成分词器
2) 要设置字段的分词器
通过客户端告诉es某个字段要使用某个分词
ES的IK分词器插件源码地址:https://github.com/medcl/elasticsearch-analysis-ik