说在前头: 本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正。若在阅读时有任何的问题,也可通过评论提出,本人将根据自身能力对问题进行一定的解答。
最近开始接触搜索引擎ElasticSearch,学习过程中可能会遗忘很多东西,因此我选择通过写文章的方式记录自己的学习过程,方便日后的复习。本人对于ElasticSearch的入门学习是通过慕课网的瓦力老师
的课程进行学习的,大家如果也想对ElasticSearch进行入门的学习,也可以通过下面的链接观看。
ElasticSearch入门:https://www.imooc.com/learn/889
对于ElasticSearch,我们可以到官网进行下载https://www.elastic.co/cn/downloads/elasticsearch
下载并解压后,进入安装目录下载bin目录,双击启动elasticsearch.bat即可(我的是window版本)。启动成功后命令行显示如下:
此时我们访问http://localhost:9200/,如果有以下信息打印出来表示elasticsearch已经成功启动成功
可视化插件我们选用elasticsearch-head
,使用易上手。具体github下载地址:https://github.com/mobz/elasticsearch-head与elasticsearch类似,下载下来后解压即可。
找到安装目录,点击打开index.html进入可视化页面,如下
对elasticsearch的操作,我们将会使用postman发送http请求做具体的操作,因此还未下载postman的小伙伴们可以去postman的官网下载:https://www.postman.com/downloads/
API基本格式:
http://:/<索引>/<类型>/<文档id>
常用HTTP动词:
GET/PUT/POST/DELETE
当我们需要创建一个名为people
的索引进行结构化的创建时,我们需要使用postman对http://localhost:9200/people发送 PUT 请求,并在请求体body
带上具体的json数据。即:
HTTP请求格式:http://
(例如:http://localhost:9200/people)
HTTP动词:PUT
HTTP请求体json信息如下:
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
}
}
}
}
参数说明:
number_of_shards
:索引分片数量
number_of_replicas
:索引备份数量
mappings
:索引结构化格式映射关键字
properties
:设置索引的属性
具体操作如下:
当我们的请求执行成功后,我们打开可视化插件elasticsearch-head可以查看到我们新创建的people索引已经显示出来了,查看其具体信息如下:
HTTP请求格式:http://
(由于es从6开始已经不支持多类型,所有的类型都为 _doc 。例如:http://localhost:9200/people/_doc/1/ )
HTTP动词:PUT
HTTP请求体json信息如下:
{
"name": "张三",
"age": 19
}
HTTP请求格式:http://
(例如:http://localhost:9200/people/_doc/1/_update)
HTTP动词:POST
HTTP请求体json信息如下:
{
"doc": {
"name": "李四"
}
}
HTTP请求格式:
http://:/<索引>/<类型>/<文档id>
(例如:http://localhost:9200/people/_doc/1/)http://:/<索引>
(例如:http://localhost:9200/people)HTTP动词:DELETE
HTTP请求体json信息:无需json数据
查询前准备
查询操作的前提是我们拥有足够的数据才可以进行查询操作,因此,我们需要使用上面学会的插入操作对对索引增加几个文档,提供我们测试查询操作。
①:简单查询
HTTP请求格式:http://
(例如:http://localhost:9200/people/_doc/1)
HTTP动词:GET
HTTP请求体json信息:无需json数据
②:查询索引下所有文档
HTTP请求格式:http://
(例如:http://localhost:9200/people/_search)
HTTP动词:GET/POST
HTTP请求体json信息如下:
{
"query": {
"match_all": {}
}
}
http://:/<索引>/_serach
(例如:http://localhost:9200/people/_search)GET/POST
{
"query": {
"match": {
"name": "治"
}
},
"from": 1,
"size": 1,
"sort": [
{
"_id": {
"order": "asc"
}
http://:/<索引>/_serach
(例如:http://localhost:9200/people/_search)GET/POST
{
"aggs": {
"group_by_id": {
"terms": {
"field": "_id"
}
}
}
}
http://:/<索引>/_serach
(例如:http://localhost:9200/people/_search)GET/POST
{
"aggs": {
"grades_id": {
"stats": {
"field": "age"
}
}
}
}
山治
时,es会查找与山
,和治
能够匹配的数据,因此,在模糊条件下查找山治
这一数据,将会把伊治
,尼治
和勇治
都返回回来){
"query": {
"match": {
"name": "山治"
}
}
}
山治
时,只会返回包含山治
的数据,并不会返回与之类似的){
"query": {
"match_phrase": {
"name": "山治"
}
}
}
{
"query": {
"multi_match": {
"query": "1",
"fields": ["_id", "age"]
}
}
}
伊
和山
de 数据){
"query": {
"query_string": {
"query": "(伊) OR (山)"
}
}
}
{
"query": {
"term": {
"age": 18
}
}
}
{
"query": {
"range": {
"age": {
"gte": 1,
"lte": 20
}
}
}
}
Filer Content在查询的过程中只判断该文档是否满足条件,只有Yes和No
{
"query": {
"bool": {
"filter": {
"term": {
"age": 18
}
}
}
}
}
{
"query": {
"constant_score": {
"filter": {
"match": {
"name": "山治"
}
},
"boost": 2
}
}
}
{
"query": {
"bool": {
"should": [
{
"match": {
"age": 18
}
},
{
"match": {
"name": "山"
}
}
]
}
}
}