Elasticsearch学习--基础概念、Query DSL

学习地址:

  https://www.bilibili.com/video/BV1SQ4y1m7Ds?p=1

三个重要概念   

  1、索引
  2、映射
  3、文档


索引:<Index>   

  一个索引就是拥有几分相似特征的文档的集合。比如,你有一个商品数据的索引,一个订单数据的索引。还有一个用户数据的索引,一个索引由一个名字来表示(必须全小写字母),并且当我们对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用这个名字
(可以近似的理解为索引就是mysql库的概念)   

es常见索引类型
- 字符串类型: keyword(关键字)、text(一段文本)
  → keyword是分词的、text是不分词的
- 数字类型:integer long(长整数)
- 小数类型:float double (精度不同)
- 布尔类型:boolean
- 日期类型:date   

映射:<Mapping>   

  映射是定义一个文档和它所包含的字段如何被存储和索引的过程。在默认配置下,es可以根据插入的数据自动创建mapping,也可以手动创建mapping。maooing中主要包括字段名、字段类型等

(近似理解为mysql中表的字段)   

- 明确告诉索引可以存放哪些数据

文档<Document>   

    即需要存放的数据。文档是索引中存储的一条条数据。一条文档是一个可以被索引的最小单元。es中的文档采用了轻量级的JSON格式数据来表示   

 

 

索引基本操作

1、查看es中有哪些 索引

GET /_cat/indices

 

 

    索引名为.开头的,是不可见索引,客户端工具去连接es会用到这些临时索引,每次启动时这些索引可能都不一样,但是与es交互的时候,必须使用这些索引的支持。   

GET /_cat/indices?v ##显示标题

 

 

 标题含义(从左到右)

索引状态   索引打开状态   索引名称   索引唯一标识   主分片数   副本数   文档数       文档删除       存储大小       主分片存储大小
health    status    index     uuid      pri     rep  docs.count   docs.deleted    store.size      pri.store.size

 

2、创建索引

PUT /productes 

注意:   单节点创建出来的索引是黄色的   

概念解释:

  主分片:   放整个索引的数据库。

  副本:   索引的备份。es在创建索引的时候,会自动给索引做备份,创建一个副本   ,

原因:单节点的es,主分片与副本放在了同一台es机器中,es认为你的备份没有意义,索引不太安全,因此展示黄色 

- 创建的时候,不创建副本(危险操作) 

PUT /orders
{
    "settings": {
        "number_of_shards": 1,
        "number_of_replicas": 0    
    }
}

 

3、删除索引

DELETE /products

 

 

映射基本操作

   注意:无法单独创建映射,脱离了索引的映射是没意义的   

es常见索引类型
- 字符串类型: keyword(关键字)、text(一段文本)
  → keyword是分词的、text是不分词的
- 数字类型:integer long(长整数)
- 小数类型:float double (精度不同)
- 布尔类型:boolean
- 日期类型:date   

1、创建映射(先创建索引、后创建映射)

PUT /products
{
    "settings": {
        "number_of_shards": 1,
        "number_of_replicas": 0        
    },
    "mappings": {
        "properties": {    ##指定当前映射可以有哪些字段、每个字段的类型
            "id": {
                "type": "integer"            
            },            
            "title": {
                "type": "keyword"            
            },
            "price": {
                "type": "double"            
            },
            "create_at": {
                "type": "date"            
            },
            "description": {
                "type": "text"            
            }
        }    
    }
}

 

2、查看映射

GET /索引名/_mapping
例:
GET /products/_mapping

注意:映射同样不能删除和修改,若创建中有字段不符,只能将索引删除重新创建

 

 

文档基本操作

1、添加文档

   /索引名/_doc #固定写法   

- 手动生成id

POST /products/_doc/1 # 指定文档id
{
    "id": 1,        ##手动指定了id,这里最好与请求中的id保持一致
    "title": "iphone13",
    "price": "8999.99",
    "create_at": "2021-09-15",
    "description": "iPhone 13采用6.1英寸OLED屏幕"
}

- 自动生成id (不指定id,body中也不用id字段)

POST /products/_doc/ # 不指定文档id
{
    "title": "iphone13",
    "price": "8999.99",
    "create_at": "2021-09-15",
    "description": "iPhone 13采用6.1英寸OLED屏幕"
}

 

2、文档查询

 GET /products/_doc/id
 例:  
 GET /products/_doc/1   

 

3、删除文档   

DELETE /products/_doc/1

 

4、更新文档

- 注意:

PUT /products/_doc/1
{
    "title": "iphone14"
}

再次查询发现,原来的信息全部没有,只剩下了title
因为这种更新方法是 删除原来的doc,重新添加当前字段doc

那么,如何更新保留文档?

基于指定的字段进行更新    _update

POST /products/_doc/1/_update
{
    "doc": {        ##doc是固定写法
        "title": "iphone14"
    }
}

 

文档批量操作

POST /products/_doc/_bulk  ##固定写法_bulk告诉es需要进行批量操作

其中:
  → index表示插入数据
  → delete表示删除数据
  → update表示更新数据   

POST /products/_doc/_bulk    
    {"index": {"_id": 2}}            ##指定id
        {"title": "xx", "price": 15}
    {"index": {}}                        ##随机id
        {"title": "oo", "price": 5}
    {"delete": {"_id": 2}}
    {"update": {"_id": 1}}
        {"doc": {"price": 1}}

批量时不会因为一个失败全部失败,而是继续执行后续操作,在返回时按执行的状态返回。
注意:批量修改时,数据字段必须在同一行

 

Query DSL   

   es高级查询Query DSL(特殊领域语言--es专属查询语言)   

   利用Rest API传递JSON格式的请求体(Request Body)数据与ES进行交互,这种方式的丰富查询语法让es检索变得更强大、更简洁。   

语法:
    # GET /索引名/_doc/_search{json格式请求体数据}
# GET /索引名/_search{json格式请求体数据} # 推荐

 

主要讲述:

  - match_all

  - term 

  - ranger   

  - prefix

  - wildcard

  - ids

  - bool

  - multi_match

  - query_string

与query同级

  - size

  - from

  - sort

  - _source

 

match_all

     返回索引全部文档   

GET /products/_search
{
    "query": {
        "match_all": {}    
    }    
}

 

term   

     基于关键词查询   

      ⇒ keywork类型: 需要将该类型的所有字符作为关键字进行搜索,否则无法搜索成功 #不分词
      ⇒ text: 英文以单个单词为关键字,中文以单个字为关键字进行搜索
      ⇒ integer类型: 不分词
      ⇒ dubbo类型:  不分词
      ⇒ date类型:    不分词
GET /products/_search
{
    "query": {
        "term": {
            "descrpition": {
                "value": "iphone"
            }        
        }    
    }
}

 

range

     范围查询   

#价格大于0小于5的doc 
GET /products/_search
{
    "query": {
        "range": {
            "price": {
                "gte": 0,   # 大于
                "lte": 5  # 小于
            }
        }    
    }
}

 

prefix

  前缀查询:用来检索指定前缀的关键词的相关文档(可以不用完整关键词)

GET /products/_search
{
    "query": {
        "prefix": {
            "description": {
                "value": "ipho"            
            }
        }
    }
}

 

wildcard   

     通配符查询 (?匹配任意一个字符,*匹配多个任意字符)    

GET /products/_search   
{
"query": { "wildcard": { "title": { "value": "ipho*" ##匹配ipho开头的关键词 ipho? 则为匹配ipho加任意一个字符的关键字,由于关键字为iphone 所以单用?是无法匹配到的 } } } }

 

ids

  多id查询   (值为数组类型,用来根据一组id获取多个对应的文档)   

GET /products/_search
{
    "query":
    {
        "ids": {
            "values": ["1","2"]
        }
    }
}

 

fuzzy   

     模糊查询(就算词语错误但也可以查询)   

GET /products/_search
{
    "query": {
        "fuzzy": {
            "title": "iphoooone"
        }
    }
}

注意:

        ⇒ 关键字只有两个字的时候,不允许模糊
  ⇒ 关键字长度为3-5,允许模糊一次(允许一个词出错)(分词器分词)
  ⇒ 关键字长度大于5,允许模糊两次(允许两个词出错)   

 

bool   

     布尔查询   

## id为1并且title是iphone13
GET /products/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "ids": {
                        "values": [1]
                    }
                },
                {
                    "term": {
                        "title": {
                            "value": "iphone13"
                        }
                    }
                }
            ]
        }
    }
}

语法:
  ⇒ must: 相当于&&同时成立
  ⇒ should: 相当于||成立一个就行
  ⇒ must_not: 相当于! 不满足任意一个   

 

multi_match   

     多字段查询   根据指定字段是否分词,结合定义的查询关键词进行查询

GET /products/_search
{
    "query": {
        "multi_match": {
            "query": "iphone 14",
            "fields": ["title","descrpition"]                         ##检索字段
        }
    }
}

上述即在title中无法匹配关键词

但是在description中,是text类型,进行分词,其中‘iphone 14’ 分为‘iphone’和‘14’,在description中可以匹配到‘iphone’所以可以返回结果

 

query_string   

     默认字段分词查询   

#查询字段分词将分词查询,不分词则不分词查询
# 即定义一个字段为分词字段,根据这个字段的分词规则去检索索引   

GET /products/_search
{
    "query": {
        "query_string": {
            "default_field": "description",
            "query": "屏幕真的非常不错"
        }
    }
}

在description中(text类型字段),会将每个中文字拆成一个一个字进行索引,

 

# 与query同级

highlight   

     高亮查询(让符合文档中的关键词高亮)   

GET /products/_search
{
"query": {
"query_string": {
"default_field": "description"
"query": "屏幕真的非常不错"
}
},
"highlight": {
# "pre_tags": [], #高亮前置标签 没有则不写,否则报错
# "post_tags": [], #高亮后置标签
"require_field_match": "false", #默认只有搜索的字段高亮,这里设为false将关闭搜索字段验证,实现全部字段高亮
"field": {
"*":{}
}
}
}


在原来的query下面加highlight(只有能分词的字段进行高亮(前后加标签))
注意:没有修改原始文档,需要原始文档出现即高亮,需要更改内容   

 

size   

     返回指定条数,指定查询结果中返回指定条数,默认返回10条   

GET /products/_search
{
    "query": {
        "match_all": {}
    },
    "size": 5
}

 

from   

     分页查询,指定初始位置,和size可以实现分页效果   

GET /products/_search
{
    "query": {
        "match_all": {}
    },
    "size": 5,
    "from": 3
}

 

sort   

     指定字段进行排序   

  降序:desc

  升序:asc

GET /products/_search
{
    "query": {
        "match_all": {}
    },
    "sort": [
    {
        "price": {
            "order": "desc"   ##升序为asc
        }
    }
    ]
}

 

_source   

     索并返回指定字段 (即不讲doc的全部字段返回,只返回需要的)

# 返回“id” “title” “price”字段
GET /products/_search { "query": { "match_all": {} }, "sort": [ { "price": { "order": "desc" ##升序为asc } } ], "_source": ["id","title","price"] }

 

posted @ 2022-05-11 18:50  wyllearning  阅读(99)  评论(0)    收藏  举报