1.ElasticSearch(ES)认识
1.是什么
ES和Lucene一样,
- 都可以进行全文搜索(创建索引,搜索索引),
- ES会启动服务,Lucene只是一个工具包,
- ES可以在分布式环境中使用。
2.为什么使用
- 数据库
模糊查询效率低
- 文本数据没有
相关度排序
- 没有
摘要截取
- 查询结果关键字没有
高亮显示
- 相比Lucene优点
- 支持分布式
- 支持多种语言,非java亦可
- Restful风格设计,调用简单
3.同类型比较
Sorl
比Sorl在实时搜索上做得更好,只支持JSON格式,轻量级。Sorl可以支持更多格式。
4.ES中的一些术语
index(索引库)
对应数据库type(文档类型)
对应数据库表document(文档)
对应表中一行数据field(列)
对应表中字段node(节点)
一个节点是一个ES实例shard(分片)
一个节点数据达到容量上限时可以使用shard,将index分为多个分片(默认一个分片),一个或者多个node共同存储该index上的数据(类似数据库分表),实现数据的水平扩展replicas(副本)
相当于shard的备份。即primary shard和replica shard构成主从关系。
2.安装使用ES
1.下载ES即使用
- es官网
- 解压打开
bin/elasticsearch.bat
即可 - 访问:
http://localhost:9200
2.下载Kibana5进行界面操作ES
- kibana下载地址
- 点击
bin/kibana.bat
启动 - 访问:
http://localhost:5601
- 下载IK分词器
https://github.com/medcl/elasticsearch-analysis-ik
,放到es/plugins
中,需要新建一个文件夹装IK分词器 - 在Dev Tools中使用
POST _analyze
{
"analyzer":"ik_max_word",
"text":"中国驻洛杉矶领事馆遭亚裔男子枪击嫌犯已自首"
}
#新增
PUT crm/employee/1
{
"id":1,
"name":"老子"
}
#新增,不指定id,自己生成一个id,需要shiy使用Post方法
POST crm/employee/
{
"id":1,
"name":"老子"
}
#查询
GET crm/employee/1
#查询所有
GET _search
#修改(全局 )
POST crm/employee/1
{
"id":1,
"name":"老头子 "
}
#局部修改
POST crm/employee/1/_update
{
"doc":{
"name":"小孩子"
}
}
#删除
DELETE crm/employee/1
#获取所有
GET _search
#1.仅查询文档内容
GET crm/employee/1/_source
#2.查询文档内容中的某个字段
GET crm/employee/1/_source?_source=name
#3.批量bulk(一次执行多个操作,仅请求一次)
#{action:{metadata}\n
#{requestbody}\n
#新增
POST _bulk
{"create":{"_index":"crm","_type":"employee","_id":555}}
{"id":555,"name":"小黑"}
{"create":{"_index":"crm","_type":"employee","_id":666}}
{"id":666,"name":"小王"}
#课件上的bulk
POST _bulk
{ "delete": { "_index": "itsource", "_type": "employee", "_id": "123" }}
{ "create": { "_index": "itsource", "_type": "blog", "_id": "123" }}
{ "title": "我发布的博客" }
{ "index": { "_index": "itsource", "_type": "blog" }}
{ "title": "我的第二博客" }
#4.批量获取
#不同库
GET _mget
{
"docs":
[
{
"_index":"crm",
"_type":"employee",
"_id":555
},
{
"_index":"itsource",
"_type":"blog",
"_id":123,
"_source":["title"]
}
]
}
#相同库
GET crm/employee/_mget
{
"ids":[222,555,666]
}
#5.字符串查询
#分页查询
GET crm/employee/_search?from=0&size=7
#查询条件
GET crm/employee/_search?q=id:1
#6.DSL的查询与过滤
PUT sky/cloud/1
{
"id":1,
"name":"仅仅3片白云",
"num":3,
"place":"天府新谷"
}
PUT sky/cloud/2
{
"id":2,
"name":"仅仅2片白云",
"num":2,
"place":"红牌楼"
}
PUT sky/cloud/3
{
"id":3,
"name":"仅仅3片白云",
"num":3,
"place":"天府新谷"
}
PUT sky/cloud/4
{
"id":4,
"name":"仅仅3片白云",
"num":3,
"place":"天府新谷"
}
PUT sky/cloud/5
{
"id":5,
"name":"仅仅5片白云",
"num":5,
"place":"金牛区"
}
PUT sky/cloud/6
{
"id":6,
"name":"仅仅6片白云",
"num":6,
"place":"天府新谷"
}
PUT sky/cloud/7
{
"id":7,
"name":"仅仅1片乌云",
"num":1,
"place":"天府新谷"
}
PUT sky/cloud/8
{
"id":8,
"name":"仅仅8片白云",
"num":8,
"place1":"天府新谷"
}
GET sky/cloud/_search
#查询 白云 天府新谷 数量>=1,<=8 从第一条开始,每页5条
GET sky/cloud/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "白云"
}
}
],
"filter": [
{
"term": {
"place": "天府新谷"
}
},
{
"range": {
"num": {
"gte": 1,
"lte": 8
}
}
}
]
}
},
"from": 1,
"size": 5,
"_source": [
"name",
"num",
"place"
],
"sort": [
{
"num": "desc"
}
]
}
#7.映射
#创建
DELETE _all
GET _search
GET _mapping
PUT sky
{
"mappings": {
"cloud":{
"properties": {
"id":{
"type":"long"
},
"name":{
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
},
"num":{
"type": "integer"
},
"place":{
"type": "keyword"
}
}
}
}
}
#8.创建索引
PUT shopping
{
"settings":{
"number_of_shards":5,
"number_of_replicas":1
}
}
GET shopping/_search
#查看节点信息
GET _cat/nodes?v
GET _cat/indices?v
3.ElasticSearch的集群
- 为什么集群
一台ES节点,可能出现故障宕机,可能承受不住并发压力,可能存储不了大量数据,所以需要使用集群来解决这样的一些问题 - ElasticSearch的节点类型