ElasticSearch基本用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch基本用法相关的知识,希望对你有一定的参考价值。
索引的创建
ElasticSearch的RESTFul API基本格式:
http://<ip>:<port>/<索引>/<类型>/<文档id>
- 常用HTTP动词:GET / POST / PUT / DELETE
1.非结构化的创建索引:
创建索引完成后,可以在概览页面中查看到分片的信息,细框的分片是粗框分片的备份或者说副本:
我们通过查看索引信息来确定该索引是非结构化还是结构化的:
2.以上我们创建了非结构化的索引,以及知道了如何查看索引信息。接下来我们创建结构化的索引,进入复合查询页面,指定一个索引,并编写结构化的数据,最后提交请求:
成功后,查看索引信息,可以看到我们所编写的结构化数据,这种就是结构化的索引:
3.其实使用es-head插件来创建结构化索引并不是很方便,编写JSON格式的结构化数据时比较蛋疼,没有智能的格式化功能。我们也可以使用postman来创建结构化的索引,基本上只要能模拟http请求的工具,都能用来创建es的结构化索引。如下:
上图中的ip和端口为es服务的ip及端口,people则是需要创建的索引名称。
映射的JSON数据如下:
{
"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"
}
}
},
"woman": {
}
}
}
提交请求成功后所反馈的信息:
可以到es-head的概览界面上,查看到新创建的索引:
插入
es的插入分为:
- 指定文档id插入
- 自动产生文档id插入
指定文档id插入,示例:
简单说明:
- people 索引
- man 类型
- 1 文档id
发送请求成功,即成功指定文档id插入数据:
到es-head的数据浏览页面上,可以看到我们刚刚插入的数据:
以上就是指定文档id的方式插入数据,接下来我们看看如何让es自动产生文档id来插入数据:
发送请求成功,es自动生成的id如下:
到es-head的数据浏览页面上,验证我们刚刚插入的数据:
修改
es有两种修改文档数据的方式:
- 直接修改文档
- 脚本修改文档
直接修改文档的方式,示例:
修改成功,返回信息如下:
文档id为1的name数据成功修改为test_name:
脚本修改文档的方式,示例:
注:es支持多种脚本语言,这里只是拿了lang来做例子
修改成功,返回信息如下:
因为当时设置age的值时,设置成了字符串类型,而字符串的相加是连接,所以文档id为1的age数据变成了2010:
我们还可以把数据放到外面,放在params里面,然后在脚本代码里引用这个数据即可,如下示例:
修改成功后,如下:
删除
关于es的删除操作,我们主要介绍以下两种:
- 删除文档
- 删除索引
删除文档,示例:
此时就只剩一个文档数据了:
在es-head上,删除索引,示例:
确认删除:
删除成功,索引下的所有数据都会被删除:
使用postman等工具,删除索引,示例:
删除成功:
注:删除索引是一个非常危险的操作,需要谨慎删除,免得删库跑路。
查询
es常用的查询语法:
- 简单查询
- 条件查询
- 聚合查询
我这里已经事先准备好了一个结构化的索引:
以及一些数据:
简单查询,就是直接使用GET方式访问需要查询的 索引->类型->文档id 即可,示例:
条件查询,我们来查询book索引下的所有数据:
查询结果如下:
简单说明:
- took 查询耗时
- time_out 是否超时
- _shards 分片信息
- hits 本次查询的数据都放在这里,默认只包含十条数据
我们可以通过如下两个参数来定义查询多少条数据,例如我指定只查询一条数据:
查询结果如下:
通过关键字进行模糊查询:
查询结果如下:
我们可以指定排序查询结果的方式,示例:
以上我们介绍了简单查询及条件查询,接下来我们简单介绍一下聚合查询,单组聚合查询示例:
{
"aggs": {
"group_by_word_count": {
"terms": {
"field": "word_count"
}
}
}
}
查询的聚合结果如下:
多组聚合查询示例:
{
"aggs": {
"group_by_word_count": {
"terms": {
"field": "word_count"
}
},
"group_by_publish_date": {
"terms": {
"field": "publish_date"
}
}
}
}
查询的聚合结果如下:
{
...
"aggregations": {
"group_by_publish_date": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 981158400000,
"key_as_string": "2001-02-03 00:00:00",
"doc_count": 1
},
{
"key": 994809600000,
"key_as_string": "2001-07-11 00:00:00",
"doc_count": 1
},
{
"key": 1107388800000,
"key_as_string": "2005-02-03 00:00:00",
"doc_count": 1
},
{
"key": 1121040000000,
"key_as_string": "2005-07-11 00:00:00",
"doc_count": 1
},
{
"key": 1215734400000,
"key_as_string": "2008-07-11 00:00:00",
"doc_count": 1
},
{
"key": 1278806400000,
"key_as_string": "2010-07-11 00:00:00",
"doc_count": 1
},
{
"key": 1310342400000,
"key_as_string": "2011-07-11 00:00:00",
"doc_count": 1
},
{
"key": 1341964800000,
"key_as_string": "2012-07-11 00:00:00",
"doc_count": 1
}
]
},
"group_by_word_count": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 195616,
"doc_count": 2
},
{
"key": 1000,
"doc_count": 1
},
{
"key": 5000,
"doc_count": 1
},
{
"key": 26000,
"doc_count": 1
},
{
"key": 63056,
"doc_count": 1
},
{
"key": 69056,
"doc_count": 1
},
{
"key": 1233616,
"doc_count": 1
}
]
}
}
}
除了可以分组聚合查询外,还可以进行统计查询等,与数据库中的聚合函数有些相似,如下示例:
{
"aggs": {
"grades_word_count": {
"stats": {
"field": "word_count" // 以word_count作为统计字段
}
}
}
}
查询的统计结果如下:
{
...
"aggregations": {
"grades_word_count": {
"count": 8,
"min": 1000,
"max": 1233616,
"avg": 223620,
"sum": 1788960
}
}
}
以上是关于ElasticSearch基本用法的主要内容,如果未能解决你的问题,请参考以下文章
elasticsearch代码片段,及工具类SearchEsUtil.java
ElasticSearch学习问题记录——Invalid shift value in prefixCoded bytes (is encoded value really an INT?)(代码片段