一. 基本概念

索引:有相同属性的文档集合(好比一个数据库)注:英文字母小写

类型:索引可以定义一个或者多个类型,文档必须属于一个类型(相当与一张表)

文档:文档是可以背索引的基本数据单位(相当于一条数据)

和索引相关的有“分片”和“备份”:

分片:每个索引都有多个分片,每个分片是一个Lucene索引

注:假如一个索引数据量很大,就会产生硬盘压力很大。所以就要‘分片’来分担压力。可以水平的扩展和拆分以及分布式的操作,可以提高搜索和其他操作。ES默认创建索引时会创建5个分片,1个备份。分片的数量只能在创建索引时指定,不能在后期修改,而备份是可以动态修改的

备份:拷贝一份分片就完成了分片的备份,注:当一个主分片失败或出现问题时,"备份分片"就可以代替工作,从而提高了ES的可用性,备份的分片还可以执行搜索的操作,来分摊搜索的压力。



二. 基础用法

RESTful API:

基本格式:http://<ip>:<port>/<索引>/<类型>/<文档id>

常用http动词:GET/PUT/POST/DELETE



Ⅰ. 创建索引



①. 非结构化创建

es索引分片规划 es的索引和分片_字段

es索引分片规划 es的索引和分片_es索引分片规划_02

es索引分片规划 es的索引和分片_字段_03

创建book索引成功后如下图:

es索引分片规划 es的索引和分片_json_04



②. 结构化创建

es索引分片规划 es的索引和分片_字段_05

打开postman,按图操作:

es索引分片规划 es的索引和分片_python_06

主要就是在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" 就好

发送命令后创建成功会看到如下图所示:

es索引分片规划 es的索引和分片_python_07

创建了三个分片一个备份

而且mapping中包含创建索引时的结构化信息:

es索引分片规划 es的索引和分片_大数据_08



③. 修改索引的 mapping

还可以在已经创建好的索引上修改mappings,具体可以参看这篇文章:,主要操作:

es索引分片规划 es的索引和分片_大数据_09



Ⅱ. 插入



①. 指定文档id插入

es索引分片规划 es的索引和分片_es索引分片规划_10

如图,url中指定了文档id为1,根据先前定义好的结构化类型参数进行json赋值,点击send后控制台返回

es索引分片规划 es的索引和分片_python_11

es索引分片规划 es的索引和分片_字段_12

点击数据浏览就可看到我们之前插入的数据:

es索引分片规划 es的索引和分片_字段_13



②. 自动产生文档id插入

自动产生文档id插入的操作十分简单,只需要把提交方式改为“post”,另外把url中指定的id去掉(此处要自动生成),点send即可:

es索引分片规划 es的索引和分片_python_14

从控制台返回的消息中我们可以看到,已经自动产生了文档id

es索引分片规划 es的索引和分片_es索引分片规划_15

刷新head的数据浏览界面可见新插入的数据:

es索引分片规划 es的索引和分片_字段_16



Ⅲ. 修改



①. _update命令修改文档

es索引分片规划 es的索引和分片_es索引分片规划_17

如图,通过 RESTful API 直接修改文档十分简单,只需要在文档id后指定要执行的操作(这里执行修改操作,即_update),然后把要修改的内容写到”doc“中,选择POST提交即可



②. PUT方式修改文档

更新记录就是使用 PUT 请求,重新发送一次数据

es索引分片规划 es的索引和分片_es索引分片规划_18

摘自: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:

es索引分片规划 es的索引和分片_大数据_19



②. 删除索引

可以直接在head插件中删除,也可以使用uri的方式,如删除people索引:

es索引分片规划 es的索引和分片_json_20



Ⅴ. 查询



①. 简单查询

a. 查询id为1的文档:

es索引分片规划 es的索引和分片_es索引分片规划_21

b. 返回novel类型下所有文档:

es索引分片规划 es的索引和分片_大数据_22



②. 条件查询

a. 查询所有数据,从位置1开始,只返回一条结果:

es索引分片规划 es的索引和分片_字段_23

{
	"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
        }
    }

求出了最小值,最大值,平均值等。