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"
}
第二个是
也就说只有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"
}
}
}
依次截图