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"
}
}
}
}
先搜索 再排序 再分组
接下来 我们就该讨论
接下来将 搜索小吕同学 小吕怎么出来的