Elasticsearch - HTTP操作索引,文档,映射;高级搜索

Posted MinggeQingchun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch - HTTP操作索引,文档,映射;高级搜索相关的知识,希望对你有一定的参考价值。

阅读本文前可先参考

https://blog.csdn.net/MinggeQingchun/article/details/126618387

https://blog.csdn.net/MinggeQingchun/article/details/126624187

HTTP操作 

(一)索引操作

1、创建索引

对比关系型数据库,创建索引就等同于创建数据库

在 Postman 中,向 ES 服务器发 PUT 请求 :http://127.0.0.1:9200/shop

请求响应返回结果如下:


    "acknowledged": true,           //相应结果,true表示操作成功
    "shards_acknowledged": true,    //分片结果,true表示分片成功
    "index": "shop"                 //索引名称

注:

创建索引库的分片数默认 1 片,在 7.0.0 之前的 Elasticsearch 版本中,默认 5 片

重复添加会报错如下:

"reason": "index [shop/oyqqKpMbRgOozeXdXpwjXA] already exists",

2、查看所有索引

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/_cat/indices?v

请求路径中的_cat 表示查看的意思,indices 表示索引

整体含义就是查看当前 ES 服务器中的所有索引,类似 mysql 中的 show tables

字段 说明
health 当前服务器健康状态: green ( 集群完整 ) yellow ( 单点正常、集群不完整 ) red ( 单点不正常 )
status 索引打开、关闭状态
index 索引名
uuid 索引统一编号
pri 主分片数量
rep 副本数量
docs.count 可用文档数量
docs.deleted 文档删除状态(逻辑删除)
store.size 主分片和副分片整体占空间大小
pri.store.size 主分片占空间大小

3、查看单个索引

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/shop


    "shop":   //索引名称
        "aliases": ,	//别名
        "mappings": ,	 //映射
        "settings": 		//设置
            "index": 		//设置-索引
                "routing": 	
                    "allocation": 	
                        "include": 	
                            "_tier_preference": "data_content"
                        
                    
                ,	
                "number_of_shards": "1",	//设置-索引-主分片数量
                "provided_name": "shop",	//设置-索引-名称
                "creation_date": "1661933272199",	//设置-索引-创建时间
                "number_of_replicas": "1",	//设置-索引-副分片数量
                "uuid": "oyqqKpMbRgOozeXdXpwjXA",	//设置-索引-唯一标识
                "version":     //设置-索引-版本
                    "created": "7160099"
                
            
        
    

4、删除索引

在 Postman 中,向 ES 服务器发 DELETE 请求 :http://127.0.0.1:9200/shop

再重新访问,索引不存在

(二)文档操作

1、创建文档

文档类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式

在 Postman 中,向 ES 服务器发 POST 请求 :http://127.0.0.1:9200/shopping/_doc

请求体内容JSON格式


 "title":"小米手机",
 "category":"小米",
 "images":"http://www.gulixueyuan.com/xm.jpg",
 "price":1999.00


    "_index": "shopping",	//索引
    "_type": "_doc",	//类型-文档
    "_id": "78wa84IBgjv8XSc-HtQq",	//唯一标识-类似mysql中的主键,随机生成
    "_version": 1,	//版本
    "result": "created",	//索引结果,true表示创建成功
    "_shards": 	//分片
        "total": 2,	//分片-总数
        "successful": 1,	//分片成功
        "failed": 0		//分片失败
    ,
    "_seq_no": 0,
    "_primary_term": 1

由于没有指定数据唯一性标识(ID),默认情况下,ES 服务器会随机生成一个

如果想要自定义唯一性标识,需要在创建时指定:http://127.0.0.1:9200/shopping/_doc/1

注:

此处发送请求的方式必须为 POST,不能是 PUT,否则会发生错误

2、查看文档

查看文档时,需要指明文档的唯一性标识,类似于 MySQL 中数据的主键查询

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/shopping/_doc/1


    "_index": "shopping",	//索引
    "_type": "_doc",	//类型-文档
    "_id": "1",
    "_version": 2,
    "_seq_no": 2,
    "_primary_term": 1,
    "found": true,	//查询结果,true表示查找到,false表示未查找到
    "_source": 	//文档源信息
        "title": "小米手机",
        "category": "小米",
        "images": "http://www.gulixueyuan.com/xm.jpg",
        "price": 1999.00
    

3、修改文档

输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖

在 Postman 中,向 ES 服务器发 POST 请求 :http://127.0.0.1:9200/shopping/_doc/1


 "title":"小米手机11",
 "category":"小米",
 "images":"http://www.gulixueyuan.com/xm.jpg",
 "price":1999.00

4、修改字段

修改一条数据的局部信息

在 Postman 中,向 ES 服务器发 POST 请求 :http://127.0.0.1:9200/shopping/_update/1

 
 "doc": 
 "price":3000.00
  

5、删除文档

删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)

在 Postman 中,向 ES 服务器发 DELETE 请求 :http://127.0.0.1:9200/shopping/_doc/1

此时再查找显示找不到

如果删除一个不存在的文档

6、条件删除文档

一般删除数据都是根据文档的唯一性标识进行删除,实际操作时,也可以根据条件对多条数进行删除

ES 服务器发 POST 请求 :http://127.0.0.1:9200/shopping/_delete_by_query


 "query":
     "match":
         "price":4000.00
     
    

 (三)映射操作

映射mapping,类似于关系数据库(database)中的表结构(table)

创建数据库表需要设置字段名称,类型,长度,约束等;索引库也一样,需要知道这个类型 下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)

1、创建映射

在 Postman 中,向 ES 服务器发 PUT 请求 :http://127.0.0.1:9200/student/_mapping

请求体内容


    "properties": 
        "name":
            "type": "text",
            "index": true
        ,
        "sex":
            "type": "text",
            "index": false
        ,
        "age":
            "type": "long",
            "index": false
        
     

映射数据

1、字段名:任意填写,如:title、images、price

2、type:类型,Elasticsearch 中支持的数据类型非常丰富,列举关键数据类型如下:

(1)String 类型,又分两种:

        text:可分词

        keyword:不可分词,数据会作为完整字段进行匹配

(2)Numerical:数值类型,分两类

        基本数据类型:long、integer、short、byte、double、float、half_float

        浮点数的高精度类型:scaled_float

(3)Date:日期类型

(4)Array:数组类型

(5)Object:对象

3、index:是否索引,默认为 true,不进行任何配置,所有字段都会被索引

        true:字段会被索引,则可以用来进行搜索

        false:字段不会被索引,不能用来搜索

4、store:是否将数据进行独立存储,默认为 false

原始的文本会存储在_source 里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source 里面提取出来的

也可以独立的存储某个字段,只要设置"store": true 即可,获取独立存储的字段要比从_source 中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置

2、查看映射 

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_mapping

 3、索引映射关联

在 Postman 中,向 ES 服务器发 PUT 请求 :http://127.0.0.1:9200/student1

请求体


    "settings": ,
     "mappings": 
     "properties": 
        "name":
         "type": "text",
         "index": true
 
        ,
        "sex":
             "type": "text",
             "index": false
        ,
        "age":
             "type": "long",
             "index": false
        
    
  

(四)高级查询

首先创建数据

# POST http://127.0.0.1:9200/student/_doc/1001

"name":"zhangsan",
"nickname":"zhangsan",
 "sex":"男",
 "age":30

# POST http://127.0.0.1:9200/student/_doc/1002

"name":"lisi",
"nickname":"lisi",
 "sex":"男",
 "age":20 

# POST http://127.0.0.1:9200/student/_doc/1003

"name":"wangwu",
 "nickname":"wangwu",
 "sex":"女",
 "age":40 

# POST http://127.0.0.1:9200/student/_doc/1004

"name":"zhangsan1",
"nickname":"zhangsan1",
 "sex":"女",
 "age":50 

# POST http://127.0.0.1:9200/student/_doc/1005

"name":"zhangsan2",
"nickname":"zhangsan2",
 "sex":"女",
 "age":30 

1、查询所有文档

match_all 字段,在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search

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

"match_all":查询类型,例如:match_all(代表查询所有)matchterm range 等等


 "query": 
    "match_all": 
   

    "took": 5,	//查询花费时间,单位毫秒
    "timed_out": false,		//是否超时
    "_shards": 	//分片信息
        "total": 1,		总数
        "successful": 1,	成功
        "skipped": 0,	忽略
        "failed": 0		失败
    ,
    "hits":  搜索命中结果
        "total": 	搜索条件匹配的文档总数
            "value": 4,  总计数值
            "relation": "eq"	技术规则:eq表示计数准确;gte表示计数不准确
        ,
        "max_score": 1.0,	匹配度分值
        "hits": [ 命中结果集合
            
                "_index": "student",
                "_type": "_doc",
                "_id": "1001",
                "_score": 1.0,
                "_source": 
                    "name": "zhangsan",
                    "nickname": "zhangsan",
                    "sex": "男",
                    "age": 30
                
            ,
            ......
        ]
    

2、匹配查询

match 匹配类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是 or 的关系

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


  "query": 
    "match": 
        "name":"zhangsan"
    
  

3、字段匹配查询

multi_match 与 match 类似,不同的是它可以在多个字段中查询

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


 "query": 
 "multi_match": 
 "query": "zhangsan",
 "fields": ["name","nickname"]
 
  

4、关键字精确查询

term 查询,精确的关键词匹配查询,不对查询条件进行分词

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


  "query": 
    "term": 
        "name": 
            "value": "zhangsan"
        
    
   
 

5、多关键字精确查询

terms 查询和 term 查询一样,它允许指定多值进行匹配

如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件,类似于 mysql 的 in

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


  "query": 
    "terms": 
        "name": ["zhangsan","lisi"]
    
   
 

6、指定查询字段

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

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

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


    "_source": ["name","nickname"], 
    "query": 
        "terms": 
            "nickname": ["zhangsan"]
        
     
 

7、过滤字段

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

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

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


    "_source": 
        "includes": ["name","nickname"]
    , 
    "query": 
        "terms": 
            "nickname": ["zhangsan"]
        
     
 

8、组合查询

bool`把各种其它通过`must`(必须 )、`must_not`(必须不)、`should`(应该)的查询方式进行组合

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


     "query": 
        "bool": 
            "must": [
                
                    "match": 
                         "name": "zhangsan"
                    
                
            ],
            "must_not": [
                
                    "match": 
                        "age": 30
                    
                
            ],
            "should": [
                
                    "match": 
                        "sex": "男"
                    
                
             ]
        
     
 

9、范围查询

range 查询找出那些落在指定区间内的数字或者时间。range 查询允许以下字符

                                操作符                        解释说明
                                gt                                       大于>
                                gte                        大于等于>=
                                lt                                小于<        
                                lte                        小于等于<=

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


    "query": 
        "range": 
            "age": 
                "gte": 30,
                "lte": 35
            
        
     

10、模糊查询

返回包含与搜索字词相似的字词的文档

编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。这些更改可以包括:

更改字符(box → fox)

删除字符(black → lack)

插入字符(sic → sick)

转置两个相邻字符(act → cat)

为了找到相似的术语,fuzzy 查询会在指定的编辑距离内创建一组搜索词的所有可能的变体或扩展。然后查询返回每个扩展的完全匹配。

通过 fuzziness 修改编辑距离。一般使用默认值 AUTO,根据术语的长度生成编辑距离。

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


    "query": 
        "fuzzy": 
            "name": 
                "value": "zhangsan"
            
        
     
 

    "query": 
        "fuzzy": 
            "name": 
                "value": "zhangsan",
                "fuzziness": 2
            
        
     
 

11、单字段排序

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

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


    "query": 
        "match": 
            "name":"zhangsan"
        
    ,
    "sort": [
        "age": 
            "order":"desc"
            
    ]

12、多字段排序

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


    "query": 
        "match_all": 
    ,
    "sort": [
        
            "age": 
                "order": "desc"
            
        ,
        
            "_score":
                "order": "desc"
            
        
    ]

13、高亮查询

Elasticsearch 可以对查询内容中的关键字部分,进行标签和样式(高亮)的设置。

在使用 match 查询的同时,加上一个 highlight 属性:

pre_tags:前置标签

post_tags:后置标签

fields:需要高亮的字段

title:这里声明 title 字段需要高亮,后面可以为这个字段设置特有配置,也可以空

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


    "query": 
        "match": 
            "name": "zhangsan"
            
        ,
    "highlight": 
        "pre_tags": "<font color='red'>",
        "post_tags": "</font>",
        "fields": 
            "name": 
         
     

14、分页查询

from:当前页的起始索引,默认从 0 开始。 from = (pageNum - 1) * size

size:每页显示多少条

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


    "query":
        "match_all":
        
    ,
    "sort":[
        
            "age":
                "order":"desc"
            
        
    ],
    "from":0,
    "size":2

15、聚合查询

聚合允许使用者对 es 文档进行统计分析,类似与关系型数据库中的 group by

(1)对某字段取最大值max

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


    "aggs":
        "max_age":
            "max":
                "field":"age"
            
        
    ,
    "size":0

(2)对某字段取最小值min

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


    "aggs":
        "min_age":
            "min":
                "field":"age"
            
        
    ,
    "size":0

(3)对某字段求和sum

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


    "aggs":
        "sum_age":
            "sum":
                "field":"age"
            
        
    ,
    "size":0

(4)对某字段求平均值avg

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


    "aggs":
        "avg_age":
            "avg":
                "field":"age"
            
        
    ,
    "size":0

(5)对某个字段的值进行去重之后再取总数

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


    "aggs":
        "distinct_age":
            "cardinality":
                "field":"age"
            
        
    ,
    "size":0

(6)State 聚合

stats 聚合,对某个字段一次性返回 count,max,min,avg 和 sum 五个指标

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


    "aggs":
        "stats_age":
            "stats":
                "field":"age"
            
        
    ,
    "size":0

16、 桶聚合查询

桶聚和相当于 sql 中的 group by 语句

(1)terms聚合,分组统计

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search


    "aggs":
        "age_groupby":
            "terms":
                "field":"age"
            
        
    ,
    "size":0

(2)terms分组,再聚合


    "aggs":
        "age_groupby":
            "terms":
                "field":"age"
            ,
            "aggs":
                "sum_age":
                    "sum":
                        "field":"age"
                    
                
            
        
    ,
    "size":0

以上是关于Elasticsearch - HTTP操作索引,文档,映射;高级搜索的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch入门——kibanna和postman操作Elasticsearch索引示例

Elasticsearch入门——kibanna和postman操作Elasticsearch索引示例

Elasticsearch7.8.0版本入门——JavaAPI操作(索引操作)

Elasticsearch7.8.0版本入门——JavaAPI操作(索引操作)

Elasticsearch入门—— Elasticsearch7.8.0版本索引操作

Elasticsearch入门—— Elasticsearch7.8.0版本索引操作