前言
日常Web 服务中,数据存储多选择mysql ,但是mysql 单表性能极致的情况数据条数区间在400w-500w之间,数据量超过这个体量时,解决方案多为,分片,分表,分库 等;但是业务数据量庞大且查询复杂到无法用DB 数据库来支撑时,此时可以引入Elasticsearch 来承载相关服务的数据操作压力;
一、Elasticsearch 是什么?
Elasticsearch 结合Kibana、Logstash、Beats 被广泛运用在大数据近实时分析领域,包括日志分析、指标监控、信息安全等多个领域。它可以帮助你探索海量结构化、非结构化数据,按需创建可视化报表,对监控数据设置报警阈值,甚至通过使用机器学习技术,自动识别异常状况。
二、使用语法
1.创建索引
// 创建索引名称为book ,分片个数为3,备份个数为1;索引字段为word_cout,title,author,publish_date
// 索引字段类型分别为type指定的索引字段类型
PUT localhost:9200/book --book
{
"settings":{
"number_of_shards":3,
"number_of_replicas":1
},
"mappings":{
"properties":{
"word_count":{
"type":"integer"
},
"author":{
"type":"keyword"
},
"title":{
"type":"text"
},
"publish_date":{
"type":"date",
"format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
2. 查询索引详情
GET localhost:9200/book
3. 索引添加数据
// 向book索引中插入数据 1 指id, 可以不加id,elasticsearch 会主动生成id,如果数据存在的情况下,该操作进行对数据更新覆盖
POST localhost:9200/book/_doc/1
{
"word_count":"1",
"author":"张三",
"title":"人与自然",
"publish_date":"2018-05-02"
}
4. 更新数据
POST localhost:9200/book/_doc/1/_update
// 更新数据
{
"doc":{
"name":"who are you"
}
}
5. 查询指定id的数据
// book 索引名称,_doc 索引类型, 查找id
POST localhost:9200/book/_doc/1
6. query 数据查询
POST localhost:9200/book/_search
// query 查询关键字,match 模糊查询,sort 排序字段
// 进行查询title 包含书籍且按照pubalist_date 进行升序排序
{
"query":{
"match":{
"title":"书籍"
}
},
"sort":[
{"publish_date":{
"order":"asc"
}}
]
}
7. 聚合计算
POST localhost:9200/book/_search
// 根据指定字段进行聚合计算
// 分别根据word_count ,publist_date 进行聚合计算
{
"aggs":{
"group_by_word_count":{
"terms":{
"field":"word_count"
}
},
"group_by_publish_date":{
"terms":{
"field":"publish_date"
}
}
}
}
// 根据指定字段进行最大最小平均求和计算,字段类型为integer
{
"aggs":{
"grades_word_count":{
"stats":{
"field":"word_count"
}
}
}
}
// 根据指定字段进行分组
{
"aggs":{
"fz":{
"terms":{
"field":"author"
}
}
}
}
8. 模糊匹配查询
POST localhost:9200/book/_search
// 模糊匹配查询
{
"query":{
"match":{
"title":"测试书籍"
}
}
}
// 多字段模糊匹配查询
{
"query":{
"multi_match":{
"query":"测试书籍",
"fields":["author","title"]
}
}
}
// 其余匹配 ,查询非“测试书籍1”的title 信息
{
"query":{
"match_phrase":{
"title":"测试书籍1"
}
}
}
9. 脚本查询
POST localhost:9200/book/_search
// 查询当前索引下内容包含测试或者test内容的数据信息
{
"query":{
"query_string":{
"query":"(测试)or test"
}
}
}
// 查询 author 和title字段中包含测试和test的字段
{
"query":{
"query_string":{
"fields":["author","title"],
"query":"测试 or test"
}
}
}
10. 区间查询
POST localhost:9200/book/_search
// 查询publist_date 时间大于gte 小于lte的数据
{
"query":{
"range":{
"publish_date":{
"gt":"1996-01-01",
"lte":"now"
}
}
}
}
11.精准查询
POST localhost:9200/book/_search
// 查询title 值为测试书籍1的信息
{
"query":{
"term":{
"title":"测试书籍1"
}
}
}
// filter 精准查询
{
"query":{
"bool":{
"filter":{
"term":{
"word_count":"32"
}
}
}
}
}
12. 复合查询
POST localhost:9200/book/_search
// 查询title 中包含 “测试”内容的数据,查询出数据的_score 值相同
{
"query":{
"constant_score":{
"filter":{
"match":{
"title":"测试"
}
}
}
}
}
// 查询时,满足should 中任意条件即可
// 查询author 或者title 中含有“测试” 内容的数据信息
{
"query":{
"bool":{
"should":[
{
"match":{
"author":"测试"
}
},{
"match":{
"title":"测试"
}
}
]
}
}
}
// 组合条件查询
// 查询 title含有测试且word_count 值为32 的数据
{
"query":{
"bool":{
"must":[
{
"match":{
"title":"测试"
}
}
],
"filter":[
{
"term":{
"word_count":32
}
}
]
}
}
}
// 非查询等价于mysql中的not in 操作
{
"query":{
"bool":{
"must_not":{
"term":{
"author":"e"
}
}
}
}
}
13. 批量查询
POST localhost:9200/book/_mget
// 批量查询id 为1,2 的数据
{
"docs":[
{
"_id":1
},
{
"_id":2
}
]
}
总结
通过以上查询,可以发现在DB 数据库可以实现的sql查询几乎在Elastic Search 中是都可以实现的;以上是对ES 数据库语法在学习过程中简单的记录。后续会继续完善相关复杂高级的应用。