ElasticSearch 基础之语法学习

前言

日常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 数据库语法在学习过程中简单的记录。后续会继续完善相关复杂高级的应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值