一. 基本概念
索引:有相同属性的文档集合(好比一个数据库)注:英文字母小写
类型:索引可以定义一个或者多个类型,文档必须属于一个类型(相当与一张表)
文档:文档是可以背索引的基本数据单位(相当于一条数据)
和索引相关的有“分片”和“备份”:
分片:每个索引都有多个分片,每个分片是一个Lucene索引
注:假如一个索引数据量很大,就会产生硬盘压力很大。所以就要‘分片’来分担压力。可以水平的扩展和拆分以及分布式的操作,可以提高搜索和其他操作。ES默认创建索引时会创建5个分片,1个备份。分片的数量只能在创建索引时指定,不能在后期修改,而备份是可以动态修改的
备份:拷贝一份分片就完成了分片的备份,注:当一个主分片失败或出现问题时,"备份分片"就可以代替工作,从而提高了ES的可用性,备份的分片还可以执行搜索的操作,来分摊搜索的压力。
二. 基础用法
RESTful API:
基本格式:http://<ip>:<port>/<索引>/<类型>/<文档id>
常用http动词:GET/PUT/POST/DELETE
Ⅰ. 创建索引
①. 非结构化创建
创建book索引成功后如下图:
②. 结构化创建
打开postman,按图操作:
主要就是在postman中新建了一个people索引,并且配置了mappings配置项,主要配置内容为:
{
"settings":{
"number_of_shards":3,
"number_of_replicas":1
},
"mappings":{
"man":{
"properties":{
"name":{
"type":"text"
},
"country":{
"type":"keyword"
},
"age":{
"type":"integer"
},
"date":{
"type":"date",
"format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
}
注:低版本的es不支持"type" : "text"改成 "type" : "String" 就好
发送命令后创建成功会看到如下图所示:
创建了三个分片一个备份
而且mapping中包含创建索引时的结构化信息:
③. 修改索引的 mapping
还可以在已经创建好的索引上修改mappings,具体可以参看这篇文章:,主要操作:
Ⅱ. 插入
①. 指定文档id插入
如图,url中指定了文档id为1,根据先前定义好的结构化类型参数进行json赋值,点击send后控制台返回
点击数据浏览就可看到我们之前插入的数据:
②. 自动产生文档id插入
自动产生文档id插入的操作十分简单,只需要把提交方式改为“post”,另外把url中指定的id去掉(此处要自动生成),点send即可:
从控制台返回的消息中我们可以看到,已经自动产生了文档id
刷新head的数据浏览界面可见新插入的数据:
Ⅲ. 修改
①. _update命令修改文档
如图,通过 RESTful API 直接修改文档十分简单,只需要在文档id后指定要执行的操作(这里执行修改操作,即_update),然后把要修改的内容写到”doc“中,选择POST提交即可
②. PUT方式修改文档
更新记录就是使用 PUT 请求,重新发送一次数据。
摘自:http://www.ruanyifeng.com/blog/2017/08/elasticsearch.html
③. 通过脚本修改文档
该方法和上面一种方法只在输入的json内容上有不同:
{
"script":{
"lang":"painless",
"inline":"ctx._source.age=params.age",
"params":{
"age":100
}
}
}
如上所示,将修改操作写进”script“中,指定脚本语言为”painless“,ctx表示当前上下文,_source表示源码,这里将age作为参数传入,进行修改
Ⅳ. 删除
①. 删除文档
只需要在url中加上要删除的文档id,选择DELETE方式提交请求即可,如删除索引people中man类型的文档1:
②. 删除索引
可以直接在head插件中删除,也可以使用uri的方式,如删除people索引:
Ⅴ. 查询
①. 简单查询
a. 查询id为1的文档:
b. 返回novel类型下所有文档:
②. 条件查询
a. 查询所有数据,从位置1开始,只返回一条结果:
{
"query":{
"match_all":{}
},
"from":1,
"size":1
}
查询语句如上,要写在”query“里,"match_all"表示查询所有,”from“ 指定位移(默认从0开始),”size“表示显示记录条数(默认10条)查询结果如下:
{
"took": 6,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 6,
"max_score": 1,
"hits": [
{
"_index": "book",
"_type": "novel",
"_id": "v4A5GWIBAZIrIv_UKnkq",
"_score": 1,
"_source": {
"author": "李六",
"publish_date": "1995-03-15",
"tittle": "es哈哈哈学习",
"word_count": 30000
}
}
]
}
}
上面代码中,返回结果的 took
字段表示该操作的耗时(单位为毫秒),timed_out
字段表示是否超时,hits
字段表示命中的记录,里面子字段的含义如下。
total
:返回记录数,本例是 2 条。max_score
:最高的匹配程度,本例是1.0
。hits
:返回的记录组成的数组。
返回的记录中,每条记录都有一个_score
字段,表示匹配的程序,默认是按照这个字段降序排列。
b. 设置score排序规则,按照”publish_date“字段降序排列:
{
"query":{
"match":{
"tittle":"es学习"
}
},
"sort":[
{"publish_date":{"order":"desc"}}
]
}
查询结果:
{
"took": 243,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 3,
"max_score": null,
"hits": [
{
"_index": "book",
"_type": "novel",
"_id": "voA4GWIBAZIrIv_UcHlf",
"_score": null,
"_source": {
"author": "王五",
"publish_date": "1995-03-17",
"tittle": "es学习",
"word_count": 20000
},
"sort": [
795398400000
]
},
{
"_index": "book",
"_type": "novel",
"_id": "v4A5GWIBAZIrIv_UKnkq",
"_score": null,
"_source": {
"author": "李六",
"publish_date": "1995-03-16",
"tittle": "es哈哈哈学习",
"word_count": 30000
},
"sort": [
795312000000
]
},
{
"_index": "book",
"_type": "novel",
"_id": "wIA5GWIBAZIrIv_UlXlz",
"_score": null,
"_source": {
"author": "田七",
"publish_date": "1995-03-15",
"tittle": "es稀里哗啦",
"word_count": 30000
},
"sort": [
795225600000
]
}
]
}
}
如上查询结果,”_score“字段为null,因为这里自定义了排序规则,结果按照”publish_date“降序排列
③. 聚合查询
a. 分别按照”word_count“和”publish_date“进行聚合查询
{
"aggs":{
"group_by_word_count":{
"terms":{
"field":"word_count"
}
},
"group_by_publish_date":{
"terms":{
"field":"publish_date"
}
}
}
}
聚合查询要使用”aggs“字段,后面的”group_by_word_count“以及”group_by_publish_date“是自定义的聚合查询名称,然后在”terms“字段下用”field“指明要聚合的字段,查询结果如下:
"aggregations": {
"group_by_publish_date": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 795225600000,
"key_as_string": "1995-03-15 00:00:00",
"doc_count": 4
},
{
"key": 795312000000,
"key_as_string": "1995-03-16 00:00:00",
"doc_count": 1
},
{
"key": 795398400000,
"key_as_string": "1995-03-17 00:00:00",
"doc_count": 1
}
]
},
"group_by_word_count": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 30000,
"doc_count": 3
},
{
"key": 4000,
"doc_count": 1
},
{
"key": 20000,
"doc_count": 1
},
{
"key": 50000,
"doc_count": 1
}
]
}
}
b. 其他功能函数的使用:
{
"aggs":{
"grades_word_count":{
"stats":{
"field":"word_count"
}
}
}
}
上述查询语句对“word_count”字段进行计算,查询结果如下:
"aggregations": {
"grades_word_count": {
"count": 6,
"min": 4000,
"max": 50000,
"avg": 27333.333333333332,
"sum": 164000
}
}
求出了最小值,最大值,平均值等。