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基本用法

ElasticSearch基本用法

ElasticSearch入门2: 基本用法

ElasticSearch的基本原理与用法

ElasticSearch学习问题记录——Invalid shift value in prefixCoded bytes (is encoded value really an INT?)(代码片段