文章目录
- 一、基础概念
- 1. ES是什么?
- 2. 名词定义
- 3. 对应关系
- 4. 索引
- 5. 分词
- 二、基础概念
- 2.1. 索引创建
- 2.2. 索引/文档删除
- 2.3. 索引修改
- 三、ES 查询
- 3.1. 简单查询
- 3.2. 分页查询
- 3.3. 复杂查询
- 四、利用analyze api搜索
- 4.1. 索引创建
- 4.2. 索引查询
- 4.3. 分词结果
- 4.4. 索引重新创建
- 4.5. 索引查询
一、基础概念
1. ES是什么?
独立的网络上的一个或自足进程节点
对外提供搜索服务(http、transport协议)
对内就是一个搜索数据库
2. 名词定义
Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的。
3. 对应关系
Relation databases | es7 |
---|---|
Databases数据库 | index索引值得是数据库结构 |
Row 行 | document文档 |
Column 列 | Field |
Schema | Mapping |
Index索引 | Ecerything indexed 所有的字段都可以来做索引 |
SQL | Query DSL |
SELECT * FROM table | GET http://… |
UPDATE FROM table | PUT http:// … |
4. 索引
搜索中的数据库或表定义
构建文档时候的索引创建
5. 分词
搜索十一分词为单位做基本的搜索单元
依靠分词器构建分词
用分词构建倒排索引
用户搜索的时候,搜索对应的分词器,分出的一个token之后,再和索引中存储的分词,找到我们想要的文档。
二、基础概念
2.1. 索引创建
- 非结构化方式
# ------------------非结构化方式-----------------
# 创建一个索引
PUT /test
{"settings" : {"number_of_shards" : 1,"number_of_replicas" : 1}
}# 分布式节点创建
# 更新其replicas状态,但是不能更新shards状态
PUT /test/_settings
{"settings" : {"number_of_replicas" : 0}
}# 创建索引,指定id建立索引
PUT /employee/_doc/1
{"name": "凯杰", "age": 30
}# 不指定id建立索引
POST /employee/_doc/
{"name": "dsfsfsf", "age": 30
}# 指定_create防止重复创建
POST /employee/_create/1/
{"name": "凯1213132杰", "age": 30
}
- 结构化方式
# 结构化创建
PUT /employee/
{"settings" : {"number_of_shards" : 1,"number_of_replicas" : 1},"mappings" : {"properties" : {"name" : { "type" : "text" },"age" : { "type" : "integer" }}}
}
2.2. 索引/文档删除
# 删除文档
DELETE /employee/_doc/1# 删除索引
DELETE /employee
2.3. 索引修改
# 指定id全量修改索引
PUT /employee/_doc/1
{"name": "凯dsfsf32杰", "age":22
}# 指定id部分字断修改
POST employee/_update/1
{"doc" : {"name" : "new_name"}
}
三、ES 查询
3.1. 简单查询
# 查询全部
GET /employee/_search# 根据主键id查询索引
GET /employee/_doc/1
3.2. 分页查询
GET /employee/_search
{"query":{"match_all": {}},"from":1,"size":1
}
3.3. 复杂查询
- 带条件
GET /employee/_search
{"query":{"match": {"name":"ES"}}
}
- 带排序
GET /employee/_search
{"query":{"match": {"name":"ES"}},"sort":[{"age":{"order":"desc"}}]
}
- 带聚合
GET /employee/_search
{"query":{"match": {"name":"ES"}},"sort":[{"age":{"order":"desc"}}],"aggs":{"group_by_age":{"terms":{"field":"age"}}}
}
四、利用analyze api搜索
4.1. 索引创建
PUT /employee/_doc/1
{"name": "Eating an apple a day & keeps the doctor away", "age": 30
}
4.2. 索引查询
GET /employee/_search
{"query":{"match": {"name":"eat"}}
}
4.3. 分词结果
没搜到后使用analyze api查看分析处理结果,可以看到没有分出eat。
GET /employee/_analyze
{"field":"name","text":"Eating an apple a day & keeps the doctor away"
}
可以看到没有分出eat,所以搜不到,改成用english分词器做
4.4. 索引重新创建
PUT /employee=
{"settings" : {"number_of_shards" : 1,"number_of_replicas" : 1},"mappings" : {"properties" : {"name" : { "type" : "text","analyzer": "english"},"age" : {"type":"integer"}}}
}
4.5. 索引查询
在用analyze api,可以看到eat
GET /employee/_analyze
{"field":"name","text":"Eating an apple a day & keeps the doctor away"
}