elasticSearch基本操作

es是一个可以看作是数据库,所以基本操作就是增删改查。这种操作的风格是用RESTful方式。

方法url
PUT(创建、替换)地址:端口/索引/类型名称/文档id{}
POST(创建)地址:端口/索引/类型名称{}
POST(更新)地址:端口/索引/类型名称/文档id/_update{}
DELETE(删除)地址:端口/索引/类型名称/文档id
GET(查询)地址:端口/索引/类型名称/文档id
POST(获得所有)地址:端口/索引/类型名称/文档id/_search

注意!!!如果没有提示可以不写类型即从PUT ubw/_doc/55—>PUT ubw/55这个是在es弱化了类型。

增加

put添加文档

PUT ubw/_doc/55
{
  "name": "w2342www",
  "age": 123
}
-----------------------------------------
PUT 索引/类型/id
{
   这里是属性以及值 
}
//这里注意,如果添加的属性值在doc中没有,会自动创建的
//如:
PUT ubw/_doc/4
{
  "name": "李社畜",
  "age": 12,
  "tag": ["程序员","社畜","牲口"],
  "doc": "老婆,我晚上加班"
}
//这里的tag doc都是没有的字段,所以会自动生成对应的属性

在这里插入图片描述

查询:

GET ubw/_doc/55
--------------------------------------
GET 索引/类型/id

{ "_index" : "ubw", // 索引 (数据库) 
 "_type" : "_doc", // 类型 (表) 
 "_id" : "55", // 文档id (表中的记录 row1) 
 "_version" : 1, // 版本,每次修改就会+1 
 "_seq_no" : 0, 
 "_primary_term" : 1, 
 "found" : true, // 是否查询到! 
 // 查询出来的数据 
 "_source" : { 
     //数据
 }

但是put如果是想要修改数据信息必须写全,不能就会报错。-------put操作其实是覆盖,替换数据

我们已经有了55,这个记录使用put

PUT ubw/_doc/55
{
  "name": "55那么"
}

在这里插入图片描述

在这里插入图片描述

更新成功但我们也发现,之前的age因为没有输入变成了空。

修改操作 update

上面我有提到update的用法:post 索引/类型/id/_update

这里面要理解es的可以看成是一个文档型的数据库,里面的文档(document)==数据(date)

POST ubw/_doc/test2/_update
{
 "doc":{  //注意这个doc
   "name": "二狗子"  //这里没有提到age
 } 
}

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

查看数据 get

通过get 索引/类型/id,进行查看记录。

在这里插入图片描述

search的查询

查询用户的一个属性,或者有一些约束的文档。

那么查询的流程应该是通过查询得到一些文档,在通过过滤器筛选出我们要的东西。

过滤的手段:1. 通过添加参数的形式;2.构建查询进行查询

1.参数查询

GET ubw/_doc/_search?q=name:

在这里插入图片描述

如果我们用王社畜,作为查询的条件会得到下面的结果

每一个结果的前面会有一个分数,分数越高匹配度越高,这个是不是就有点像我们在百度搜索的时候的情形。

GET ubw/_doc/_search?q=name:王社畜
---------------------------------------------------------------------
{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 3.5485349,
    "hits" : [
      {
        "_index" : "ubw",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 3.5485349,
        "_source" : {
          "name" : "王社畜",
          "age" : 12,
          "tag" : [
            "程序员",
            "大佬",
            "社畜"
          ],
          "doc" : "你们见过程序猿么?"
        }
      },
      {
        "_index" : "ubw",
        "_type" : "_doc",
        "_id" : "4",
        "_score" : 2.154657,
        "_source" : {
          "name" : "李社畜",
          "age" : 12,
          "tag" : [
            "程序员",
            "社畜",
            "牲口"
          ],
          "doc" : "老婆,我晚上加班"
        }
      },
      {
        "_index" : "ubw",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0754795,
        "_source" : {
          "name" : "隔壁大佬王",
          "age" : 12,
          "tag" : [
            "隔壁的人",
            "暖男",
            "女朋友多"
          ],
          "doc" : "你老公不在家就过来吃饭吧"
        }
      }
    ]
  }
}

2.构建查询进行

GET ubw/_doc/_search
{
  "query":{ //通过过query构建条件
    "match":{ // 将查询条件放入 match 中
      "name": "王社畜"
    }
  }
}
-----------------------------------------------------------------------
//查询所有
GET ubw/_doc/_search
{
  "query":{
    "match_all":{}
  }
}

在这里插入图片描述

现在我们只想看一部分数据:通过source

GET ubw/_doc/_search
{
  "query":{
    "match_all":{}
  }, //查询到了所有 在进行过滤
  "_source":["name","doc"]
}

在这里插入图片描述

如果我们要返回有顺序要用sort

GET ubw/_doc/_search
{
  "_source":["name","doc"],
  "query":{
    "match_all":{}
  },
  "sort":[
    {
      "age":{
        "order":"asc"
      }
    }
    ]
}

在这里插入图片描述

复杂查询

查询范围
在这里插入图片描述
在这里插入图片描述

在must/must not/should里面东西和query里面存的值是一样的,这个也就可以理解为好似一个嵌套的查询。而这个must是连接多个条件数组的核心。

比如我们找名字里有社畜而且描述里有老的用户

GET ubw/_search
{
  "query": {
    "bool": {
     "must": [ // 这里强调,must可以是一组条件。
       {
         "match": {
           "name": "社畜"
         }
       },
       {
         "match": {
           "doc": "老"
         }
       }
     ]
    }
  }
}

在这里插入图片描述

这里的must = and、 这里的must not = not、这里的should = or

查询数值的区间

比如年龄大于100的:

这里我们可以用过滤的思想。

在这里插入图片描述

gt大于、lt小于、gte大于等于、lte小于等于

GET ubw/_search
{
  "query": {
    "bool": {
     "filter": {
       "range": {
         "age": {
           "gte": 15,
           "lte": 200
         }
       }
     }
    }
  }
  
}
---------------------------------------------------------------------
GET ubw/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "age": {
              "gte": 15,
              "lte": 200
            }
          }
        }
      ]
    }
  }
}

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

小结:其实查询的方式有很多,条件查询和过滤器,两个都能达到目标,不过具体的项目要怎么使用还是得看环境吧。

自定义的type映射

我们注意到

在这里插入图片描述

所有的字段都是keyword字段。

这两个有什么不同的呢?

POST _analyze
{
  "analyzer": "standard",
  "text": "ubw java"
}

POST _analyze
{
  "analyzer": "keyword",
  "text": "ubw java"
}

1590500862319.png

第二个是

在这里插入图片描述

也就说只有standard类型的会进行分词,而keyword不会进行分词。同时注意 英语分分词只是根据空格。UBW并不是一个英语单词,也不会拆分。

我们可以通过过mapping进行映射,从而得到新的类型。

我们用username和password表进行实验测试

PUT ucenter
{
  "mappings": {
    "properties": {
      "name":{ // 名字我们默认可以拆分
        "type": "text"
      },
      "password":{ // 密码我们默认是不能拆分
        "type": "keyword"
      }
    }
  }
}

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

插入两个数据。

PUT ucenter/_doc/1
{
  "name": "ubw java",
  "password": "ubw java"
}

PUT ucenter/_doc/2
{
  "name": "ubw spring",
  "password": "ubw spring"
}

我们通过查询看看两个的区别

// 查询的是一个text类型 会进行正常的分词
GET ucenter/_search
{
  "query": {
    "match": {
      "name": "ubw spring"
    }
  }
}
// 查询的是keyword的类型 不会分词 所以只有一个记录
GET ucenter/_search
{
  "query": {
    "match": {
      "password": "ubw spring"
    }
  }
}
//  查询的ubw会直接匹配 多余的部分一个不要
GET ucenter/_search
{
  "query": {
    "match": {
      "password": "ubw"
    }
  }
}

依次截图

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值