ElasticSearch入门及基础操作
一、概述
ElasticSearch简称ES,ES是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好。可以扩展到上百台服务器,处理PB级别的数据。
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的[全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
**倒排索引:**倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。
二、基本操作
1、索引
创建一个叫shopping的索引,使用postman工具发送PUT请求,命令如下:
http://127.0.0.1:9200/shopping
获取索引:命令不变,将PUT请求换成GET请求即可
删除索引:同理,改成DELETE请求
2、文档
索引已经建好,创建文档并添加数据。发送如下POST请求,添加的数据格式为JSON格式
http://127.0.0.1:9200/shopping/_doc
请求体内容为:
{
"title":"小米手机",
"category":"小米",
"image":"http://www.xxxx.com/doge.jpg",
"price":3999.00
}
也可以在_doc后面跟上id来指定id,请求格式如下(这种指定id的方式使用POST和PUT请求都可以,没有指定id的方式只能使用POST请求且每次生成的id是不一样的):
http://127.0.0.1:9200/shopping/_doc/1001
主键查询:
根据id来查询(GET请求):
http://127.0.0.1:9200/shopping/_doc/1001
全查询(GET请求):
http://127.0.0.1:9200/shopping/_search
3、修改
全量数据的修改(PUT请求):
http://127.0.0.1:9200/shopping/_doc/1001
{
"title":"小米手机222",
"category":"小米",
"image":"http://www.xxxx.com/doge.jpg",
"price":4999.00
}
局部修改(POST请求):
http://127.0.0.1:9200/shopping/_update/1001
JSON数据格式(只修改id为1001的title的值):
{
"doc":{
"title":"华为手机"
}
}
删除数据(DELETE请求):
http://127.0.0.1:9200/shopping/_doc/1001
4、复杂查询
条件查询
GET请求
http://127.0.0.1:9200/shopping/_search?q=category:小米
不过这种方式中文容易出现乱码,所以推荐将参数放在body中进行查询,如下:
http://127.0.0.1:9200/shopping/_search
Body请求json数据为:
{
"query":{
"match":{
"category":"小米"
}
}
}
分页查询
Body请求JSON格式为:
{
"query":{
"match_all":{
}
},
"from":0,
"size":2
}
分页+只显示想要的字段+排序
{
"query":{
"match_all":{
}
},
"from":0,
"size":2 ,
"_source":["title","price"],
"sort":{
"price":{
"order":"desc"
}
}
}
多条件查询
must为必须条件,如果想用或者,则改为should即可
{
"query":{
"bool":{
"must":[
{
"match":{
"category":"小米"
}
},{
"match":{
"price":3999.00
}
}
]
}
}
}
查询分类为小米或华为的、价格区间大于1000的JSON格式:
{
"query":{
"bool":{
"should":[
{
"match":{
"category":"小米"
}
},{
"match":{
"category":"华为"
}
}
],
"filter":{
"range":{
"price":{
"gt":1000
}
}
}
}
}
}
当保存文档数据时,ES会将数据文字进行分词拆解操作,并将拆解后的数据保存到倒排索引当中这样即使使用文字的一部分,也能查询到数据,这种检索方式我们称之为全文检索,ES也会将查询内容进行分词在倒排索引中去进行匹配。
{
"query":{
"match":{
"category":"米为"
}
}
}
如上,“米为”进行分词,拆成“米”和“为”,所以就都能查询有“米”和“为的”。如果要使用完全匹配,则可以使用“match_phrase”。
对某个字段进行高亮显示:
{
"query":{
"match":{
"category":"米为"
}
},
"highlight":{
"fields":{
"category":{}
}
}
}
聚合查询
分组
{
"aggs":{ //聚合操作
"price_group":{ //名称,随意起名
"terms":{ //分组
"field":"price" //分组字段
}
}
},
"size":0 //不显示原始结果
}
平均值
{
"aggs":{ //聚合操作
"price_avg":{ //名称,随意起名
"avg":{ //平均值
"field":"price" //分组字段
}
}
},
"size":0 //不显示原始结果
}
4、映射
先创建一个user的索引(PUT):
http://127.0.0.1:9200/user
再创建_mapping映射(PUT)
http://127.0.0.1:9200/user/_mapping
{
"properties":{
"name":{
"type":"text",
"index":"true"
},
"sex":{
"type":"keyword",
"index":"true"
},
"tel":{
"type":"text",
"index":"false"
}
}
}
添加数据(PUT)
http://127.0.0.1:9200/user/_create/1001
{
"name":"小米",
"sex":"男",
"tel":"1111"
}
其中:属性name:可以正常查询
属性sex:需要全部匹配才能查询
属性tel:作为查询条件是查询不到的
http://127.0.0.1:9200/user/_search
{
"query":{
"match":{
"name":"小"
}
}
}
与java封装的基本操作项目地址:https://gitee.com/jackSparrowQAQ/ElasticSearchPro