分布式搜索基础<2.2>

1.索引创建完毕之后,我们现在要创建数据,呢么创建数据怎么创建
1.1  使用Put命令创建语句
PUT /test/_doc/1
{
    
    
  "name":"小吕同学",
  "age":30
}
此时我没有指定任何mapping 我们这条数据在es中他怎么去存储的
看mapping  
现在mapping下有很多东西 _doc 就是我们刚刚指定的_doc
age的type是long  其实年龄不可能用到long  但是他会让你的数据尽可能 正确他用的long 
 age text	
所以说我们这中形式就叫做不指定mapping创建文档
2. GET/test/_doc/1 拿到指定id的数据
   GET /test/_search  查询test 索引下的数据
 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 PUT /test/_doc/1
{
    
    
    "name":"小吕同学",
  "age":40
}
//  修改我们可以用PUT进行修改  但是PUT全量修改索引 会把原有的id为1 的 文档进行全量覆盖

在这里插入图片描述

比如说

PUT /test/_doc/1
{
    
    
"name":"1111"
	
}
//  PUT请求是更新操作 每次返回结果result 是update 所以每次更改后varsion +1
我修改了 我把name改成 1111 再次查询语句
GET /test/_search
现在看到了 1的数据已经被覆盖了

在这里插入图片描述

但是我只是想把名字改成1111 其他字段我不想动啊
初始值是 name为小吕同学
		age 为30
		现在我只是想把name改成111,其余的字段我不想改怎么办
//  可以使用这条命令
POST /test/_doc/1/_update
{
    
    
  "doc": {
    
    
      "name":"111"
  }
}		

在这里插入图片描述

看结果 update 我们再用 GET /test/_search 查询下 

在这里插入图片描述
在这里插入图片描述

POST可以做更改 操作 也可以做创建操作 看结果 created 代表此时我们创建成功了。 如果 我们再执行一次就会报异常 因为 POST此时执行的创建 就类似于数据库的insert,再次执行insert 会抛异常 

在这里插入图片描述

当我POST 再次执行_created的时候 会报错 他会提示已经创建了

在这里插入图片描述

当我们执行DELETE /test/_doc/3  删除操作的时候他会删除者条数据
并且把这个数据所在的分片以及副本删除了 所以此时是2	因为副本是1 啊

在这里插入图片描述
在这里插入图片描述

PUT /test/_doc/1
{
    
    
"name":"1111"
	
}

POST /test/_doc/1/_update
{
    
    
  "doc": {
    
    
      "name":"111"
  }
}	
put请求和post_update都是进行update操作 所以每次进行操作的时候 版本好加1  不过Put会重新覆盖
POST只会进行修改
这就是我们es中简单的一些索引的创建,现在我们怎么结构话创建索引
就是说指定Mapping 你再创建索引的时候 不要采用他的默认值


PUT /test
{
    
    
  "settings": {
    
    
    "number_of_replicas":"1"
    , "number_of_shards": 1
  }
  
}
// 一个es集群 我最起码要求 有一个分片一个副本啊  
建立分片意味着我们要对数据进行预估 因为分片一旦建立了不能改啊
我们还可以添加mapping对字段进行设置 比如说年龄 不可能用long表示 这样就会过滤很多垃圾数据
  "mappings": {
    
    
    "_doc":{
    
    
        "properties":{
    
    
           "name" : {
    
    "type":"text"},
          "age" : {
    
    "type":"integer"}
        }
    }
  }

在这里插入图片描述

看此时的mapping就是我们刚刚设置的字段 的类型	

在这里插入图片描述

当我们输入"1" 的时候是可用的 但是当我们输入 “aaa”字符串的时候就会抛异常 因为我们限制了他字段的范围 这样就会过滤掉很多垃圾数据

在这里插入图片描述

此时我再加一个字段"gender"

在这里插入图片描述
在这里插入图片描述

加成功了因为 es是一个nosql数据库  意味着数据的列是不确定的

在这里插入图片描述

继续看mapping 此时给你默认加了这个gender的属性
加了 "type" 意味着要给你的字段加约束条件 这样就会降低垃圾数据
es中有那些type 

在这里插入图片描述

可以被解析 意味着可以被分词 
不可以被解析意味着不能被分词  只能做精确匹配
 ---------------------------------------->
 下面说下es中的查询 大致分这么几种查询

在这里插入图片描述

主键查询就是基于id查询
GET /test/_doc/1

在这里插入图片描述

查询all就是把数据全查出来

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

在这里插入图片描述

分页就是 加个from  size  
分页 es 有个致命的问题  不能查太多分页 因为分页在内存中完成的
https://www.jianshu.com/p/4781b3441ca7
因为你此时带查询条件了,但是他的数据在不同的分片中 所以 他的按照你的查询条件 在不同的分片中进行筛选 然后再进行分页

在这里插入图片描述

条件查询  匹配名字查询
GET /test/_search
 {
    
    
   "query": {
    
    
     "match": {
    
    
       "name": "小吕同学"
     }
   }
  
 }
 但是 当匹配 name=小吕同学时候 还会把小吕搜索出来 这是为啥?
 
 如果说我们是mysql    select * from db where name like '%小吕同学%'
 他此时的小吕是搜不来的
 怎么出来的 这个就涉及到了分词

在这里插入图片描述

es中也有排序  

 GET /test102/_search
 {
    
    
   "query": {
    
    
     "match": {
    
    
       "name": "小吕同学"
     }
   }
   , "sort": [
  
     {
    
    
          "age": {
    
    
         "order": "desc"
       }
     }
   ]
  
 }
 先搜索出来,用sort 对age进行排序

在这里插入图片描述

聚合查询 就是类似于group By 进行分组



 GET /test/_search
 {
    
    
   "query": {
    
    
     "match": {
    
    
       "name": "小吕同学"
     }
   }
   , "sort": [
  
     {
    
    
          "age": {
    
    
         "order": "desc"
       }
     }
   ]
  ,
  "aggs": {
    
    
    "group_by_age": {
    
    
      "terms": {
    
    
        "field": "age"
        
      }
    }
  }
  
 }
  先搜索 再排序 再分组

在这里插入图片描述

接下来 我们就该讨论
接下来将 搜索小吕同学 小吕怎么出来的

Guess you like

Origin blog.csdn.net/weixin_43689953/article/details/115288469