day11 基于Rest的操作、查询聚合索引

目录

1Rest

2操作索引

put get delete

3查询

基本查询(match, match_all,term)

结果过滤(_source过滤、指定includes和excludes、fuzzy、filter)

高级查询(bool range)

排序(order:分为单字段与多字段)

4聚合(aggregations:分为桶与度量)

扫描二维码关注公众号,回复: 12633430 查看本文章

1Rest

REST,即Representational State Transfer的缩写。直接翻译的意思是"表现层状态转化"。 

它是一种互联网应用程序的API设计理念:URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。

参考链接:https://www.jianshu.com/p/73d2415956bd

2.操作索引

2.1.基本概念

Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的。

对比关系:

索引(indices)--------------------------------Databases 数据库

​ 类型(type)-----------------------------Table 数据表

​ 文档(Document)----------------Row 行

​ 字段(Field)-------------------Columns 列

2.2.创建索引

2.2.1.语法

Elasticsearch采用Rest风格API,因此其API就是一次http请求,你可以用任何工具发起http请求

创建索引的请求格式:

请求方式:PUT

请求路径:/索引库名

请求参数:json格式:

{

    "settings": {

        "number_of_shards": 3,

        "number_of_replicas": 2

      }

}

settings:索引库的设置

number_of_shards:分片数量

number_of_replicas:副本数量

 

2.3.查看索引设置

语法

Get请求可以帮我们查看索引信息,格式:

 

2.4.删除索引

删除索引使用DELETE请求

语法

DELETE /索引库名

 

 

2.5.映射配置

索引有了,接下来肯定是添加数据。但是,在添加数据之前必须定义映射。

什么是映射?

​ 映射是定义文档的过程,文档包含哪些字段,这些字段是否保存,是否索引,是否分词等

只有配置清楚,Elasticsearch才会帮我们进行索引库的创建(不一定)

 

2.5.1.创建映射字段

语法

请求方式依然是PUT

PUT /索引库名/_mapping/类型名称

{

  "properties": {

    "字段名": {

      "type": "类型",

      "index": true,

      "store": true,

      "analyzer": "分词器"

    }

  }

}

类型名称:就是前面将的type的概念,类似于数据库中的不同表 字段名:任意填写 ,可以指定许多属性,例如:

type:类型,可以是text、long、short、date、integer、object等

index:是否索引,默认为true

store:是否存储,默认为false

analyzer:分词器,这里的ik_max_word即使用ik分词器

示例

发起请求:

PUT heima/_mapping/goods

{

  "properties": {

    "title": {

      "type": "text",

      "analyzer": "ik_max_word"

    },

    "images": {

      "type": "keyword",

      "index": "false"

    },

    "price": {

      "type": "float"

    }

  }

}

 

响应结果:

{

  "acknowledged": true

}

 

 

3.查询

 

我们从4块来讲查询:

 

基本查询

结果过滤

高级查询

排序

 

3.1.基本查询:

基本语法

GET /索引库名/_search

{

    "query":{

        "查询类型":{

            "查询条件":"查询条件值"

        }

    }

}

这里的query代表一个查询对象,里面可以有不同的查询属性

 

查询类型:

例如:match_all, match,term , range 等等

查询条件:查询条件会根据类型的不同,写法也有差异,后面详细讲解

 

3.1.1 查询所有(match_all)

示例:

GET /heima/_search

{

    "query":{

        "match_all": {}

    }

}

 

3.1.2 匹配查询(match)

3.1.3 多字段查询(multi_match)

3.1.4 词条匹配(term)

term 查询被用于精确值 匹配,这些精确值可能是数字、时间、布尔或者那些未分词的字符串

3.1.5 多词条精确匹配(terms)

terms 查询和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件:

3.2.结果过滤

默认情况下,elasticsearch在搜索的结果中,会把文档中保存在_source的所有字段都返回。

如果我们只想获取其中的部分字段,我们可以添加_source的过滤

3.2.1.直接指定字段

示例:

GET /heima/_search

{

  "_source": ["title","price"],

  "query": {

    "term": {

      "price": 2699

    }

  }

}

3.2.2.指定includes和excludes

我们也可以通过:

includes:来指定想要显示的字段

excludes:来指定不想要显示的字段

 

3.3 高级查询

 

3.3.1 布尔组合(bool)

bool把各种其它查询通过must(与)、must_not(非)、should(或)的方式进行组合

3.3.2 范围查询(range)

range 查询找出那些落在指定区间内的数字或者时间

GET /heima/_search

{

    "query":{

        "range": {

            "price": {

                "gte":  1000.0,

                "lt":   2800.00

            }

     }

    }

}

range查询允许以下字符:

 

操作符 说明

gt 大于

gte 大于等于

lt 小于

lte 小于等于

 

3.3.3 模糊查询(fuzzy)

fuzzy 查询是 term 查询的模糊等价。它允许用户搜索词条与实际词条的拼写出现偏差,但是偏差的编辑距离不得超过2:

3.4 过滤(filter)

条件查询中进行过滤

所有的查询都会影响到文档的评分及排名。如果我们需要在查询结果中进行过滤,并且不希望过滤条件影响评分,那么就不要把过滤条件作为查询条件来用。而是使用filter方式:

3.5 排序

3.4.1 单字段排序

sort 可以让我们按照不同的字段进行排序,并且通过order指定排序的方式

GET /heima/_search

{

  "query": {

    "match": {

      "title": "小米手机"

    }

  },

  "sort": [

    {

      "price": {

        "order": "desc"

      }

    }

  ]

}

3.4.2 多字段排序

 

假定我们想要结合使用 price和 _score(得分) 进行查询,并且匹配的结果首先按照价格排序,然后按照相关性得分排序:

 

4. 聚合aggregations

 

聚合可以让我们极其方便的实现对数据的统计、分析。例如:

 

什么品牌的手机最受欢迎?

这些手机的平均价格、最高价格、最低价格?

这些手机每月的销售情况如何?

实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现实时搜索效果

 

Elasticsearch中的聚合,包含多种类型,最常用的两种,一个叫桶,一个叫度量:

 

桶(bucket)

桶的作用,是按照某种方式对数据进行分组,每一组数据在ES中称为一个桶,例如我们根据国籍对人划分,可以得到中国桶、英国桶,日本桶……或者我们按照年龄段对人进行划分:010,1020,2030,3040等。

度量(metrics)

分组完成以后,我们一般会对组中的数据进行聚合运算,例如求平均值、最大、最小、求和等,这些在ES中称为度量

4.2 聚合为桶

 

首先,我们按照 汽车的颜色color来划分桶

GET /cars/_search

{

    "size" : 0,

    "aggs" : {

        "popular_colors" : {

            "terms" : {

              "field" : "color"

            }

        }

    }

}

size: 查询条数,这里设置为0,因为我们不关心搜索到的数据,只关心聚合结果,提高效率

aggs:声明这是一个聚合查询,是aggregations的缩写

popular_colors:给这次聚合起一个名字,任意。

terms:划分桶的方式,这里是根据词条划分

field:划分桶的字段

猜你喜欢

转载自blog.csdn.net/qq_42198024/article/details/107890048