Elasticsearch 系列指南(二)——基本用法

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mjwwjcoder/article/details/79077367

Elasticsearch是以Restful 风格来命名自己的API的,因此这节就以此来学习下Elasticsearch的基本用法。

基本用法

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

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

创建索引

打开我们的head插件:http://localhost:9100/

点击索引-创建索引 如图:

这里写图片描述

填写索引名称、分片数、被分数(默认为5个分片1个备份),注意分片创建成功后无法修改,备份数可随意修改,创建完成后如图所示:

这里写图片描述

book为索引名称,01234为5个分片,粗线框为主分片,细线框为备份分片,对应关系如:细线框0为粗线框0的备份,以此类推,通常备份和主分片在不同的节点上,这样一个节点挂了还有备份分片。

以上为非结构化索引,相反还有结构化索引,那么怎么区分呢?

点击上面的信息-索引信息出现如图:查看里面的结构化关键词mappings,为空则为非结构化索引

这里写图片描述

那么如果创建结构化索引呢:
点击复合查询输入如下格式:

这里写图片描述

点击易读-验证JSON正确后提交,在点击信息-索引信息查看mappings有结构映射的,即为格式化的索引

这里写图片描述

以上我们创建索引是在head插件了,但head并不是很完美,这里我推荐使用postman这个工具,他是一个具有http请求的模拟器,可以自动验证json格式,具体用法可以百度下很简单,如图创建people这个索引:

这里写图片描述

基本增删改查

插入文档

指定文档id插入

自动产生文档id插入

文档id是一个唯一索引值指向我们的文档数据

下面我们来插入一条数据

这里写图片描述

可以看到已经插入成功,可以去head插件查看具体信息,这里解释下120.0.0.1:9200/people/man/1 peolpe为创建的文档索引man为文档类型1为文档id,因此这里是指定文档id插入,而自动产生文档id插入只需将请求的动词PUT改为POST地址120.0.0.1:9200/people/man/1改为120.0.0.1:9200/people/man即可,这时的id就会自动帮我们生成,是随机的一行字符串,点击head插件的数据浏览即可看到结果

这里写图片描述

修改文档

直接修改文档:请求的动词PUT改为POST地址120.0.0.1:9200/people/man/1改为120.0.0.1:9200/people/man/1/_update即可,参数加上doc如:

{
    "doc":{
        "name":"哈哈"
    }
}

脚本修改文档:请求方式地址同上,参数改为

{
    "script":{
        "lang":"painless",           //指定脚本语言
        "inline":"ctx._source.age += 10"   //脚本内容
    }
}
ctx:上下文,_source:当前文档内容 指在原来年龄上加10
{
    "script":{
        "lang":"painless",
        "inline":"ctx._source.age = params.age",
        "params":{
            "age":100
        }
    }
}
这种方式可以指定年龄为多少

删除文档

设置请求方式为DELETE地址为120.0.0.1:9200/people/man/1即可删除id为1的文档

删除索引

设置请求方式为DELETE地址为120.0.0.1:9200/people即可,或者在head插件直接删除,需要注意删除索引后将索引下的数据也会删除掉

查询

简单查询:设置请求方式为GET地址为120.0.0.1:9200/people/man/1即查询id为1的文档

条件查询:设置请求方式为POST地址为120.0.0.1:9200/people/_search各种查询条件(参数:均以query为关键词)为:

{
    "query":{
        "match_all":{}      //查询所有
    },
    "from":0,       //查询数据的起始位置
    "size":1        //返回的数据条数
}
{
    "query":{
        "match":{
            "name":"小王"     //条件查询,名字为小王的数据,默认会查到含有小王任意一个字的所有数据局,改为match_phrase只查包含小王的数据,改为term更精准查询,只查是小王的数据
        }
    },
    "sort":[                    //排序,按时间倒序
        {
            "date":{
                "order":"desc"
            }
        }
    ]
}

聚合查询:设置请求方式为POST地址为120.0.0.1:9200/people/_search 关键字为aggs查询条件为:

{
    "aggs":{
        "group_by_age":{        //指定查询结果的名字
            "terms":{           //查询统计不同年龄的个数
                "field":"age"
            }
        },
        "group_by_date":{
            "terms":{
                "field":"date"      //查询不同日期的个数
            }
        }
    }
}
//可以设置多个分组
{
    "aggs":{
        "grades_age":{      //指定查询结果的名字
            "stats":{       //查询统计年龄的个数最大最小值平均值等
                "field":"age"
            }
        }
    }
}
//stats可改为其他如:min为查最小值

高级查询

子条件查询:特定子弹查询所指特定值,又分为Query contextFilter context

Query context:在查询过程中,除了判断文档是否满足查询条件外,ES还会计算一个_score来标识匹配的程度,旨在判断目标文档和查询条件匹配的有多好

模糊查询:设置请求方式为POST地址为120.0.0.1:9200/people/_search查询条件为:

{
    "query":{
        "multi_match":{
            "query":"小花",
            "fields":["name","country"]
        }
    }
}
//查询name和country中有小花数据

语法查询:设置请求方式为POST地址为120.0.0.1:9200/people/_search查询条件为:

{
    "query":{
        "query_string":{        //语法查询关键字
            "query":"小花 or 小明",
            "fields":["name","country"]
        }
    }
}
查询小花 or 小明在name和country两个子段的数据

范围查询:设置请求方式为POST地址为120.0.0.1:9200/people/_search查询条件为:

{
    "query":{
        "range":{
            "age":{
                "gt":20,        //大于20
                "lte":27        //小鱼等于27 ,e是equals的意思等于
            }
        }
    }
}
//查询年龄大于20小鱼等于27的数据

Filter context:在查询过程中,只判断文档是否满足条件,只有YES或者NO,Filter就是过滤的作用,只差复合Filter条件的数据,效率比query要快,必须要和bool配合使用

{
    "query":{
        "bool":{
            "filter":{
                "term":{
                    "age":22
                }
            }
        }
    }
}
//查询年龄为22的数据

复合条件查询:以一定的逻辑组合子条件查询

{
    "query":{
        "bool":{
            "must":[    //必须满足下面两个条件,与的关系,改为should就是或的关系及满足之一就可以,改为must_not为一定不满足
                {
                    "match":{
                        "name":"小明"
                    }
                },{
                    "match":{
                        "country":"小花"
                    }
                }
            ],
            "filter":[              //拦截年龄为22的
                {
                    "term":{
                        "age":22
                    }
                }
            ]
        }
    }
}
//查询必须满足name包含小明和country包含小花且年龄为22的数据
展开阅读全文

没有更多推荐了,返回首页