Elasticsearch的CRUD

2020-02-25 12:00:36 浏览数 (1)

前言

本文使用的Elasticsearch版本为6.5.4,上文主要介绍了它的Index(数据库)和Mapping(表结构),那么本文主要记录一下关于Elasticsearch的增删改以及普通查询操作。

ES的添加数据

语法:PUT /Index名(数据库)/Type名(即表名)/Document名(一条记录的主键){ json数据 }

代码语言:javascript复制
PUT /ecommerce/product/1
{
    "name" : "gaolujie yagao",
    "desc" :  "gaoxiao meibai",
    "price" :  30,
    "producer" :      "gaolujie producer",
    "tags": [ "meibai", "fangzhu" ]
}
PUT /ecommerce/product/2
{
    "name" : "jiajieshi yagao",
    "desc" :  "youxiao fangzhu",
    "price" :  25,
    "producer" :      "jiajieshi producer",
    "tags": [ "fangzhu" ]
}
PUT /ecommerce/product/3
{
    "name" : "zhonghua yagao",
    "desc" :  "caoben zhiwu",
    "price" :  40,
    "producer" :      "zhonghua producer",
    "tags": [ "qingxin" ]
}

注意事项:「ES在6.x版本调整了, 一个index只能存储一种type。」

即是说,在上面的添加数据完毕之后,再执行下面的代码,是会报错的。

代码语言:javascript复制
PUT /ecommerce/product1/3
{
    "name" : "zhonghua yagao",
    "desc" :  "caoben zhiwu",
    "price" :  40,
    "producer" :      "zhonghua producer",
    "tags": [ "qingxin" ]
}

ES的修改数据

语法:POST /Index名(数据库)/Type名(即表名)/Document名(一条记录的主键)/_update { 待修改的json数据 }

代码语言:javascript复制
POST /ecommerce/product/1/_update
{
  "doc" : {
    "name" : "jiaqianban gaolujie yagao1"
  }
}

修改数据还有另外一种操作,就是覆盖,即是将数据重新添加到该document下实现替换操作。如下:

代码语言:javascript复制
PUT /ecommerce/product/1
{
  "name" : "jiaqiangban gaolujie yagao",
  "desc" : "gaoxiao meibai",
  "price" : 30,
  "producer" : "gaolujie producer",
  "tags" : [ "meibai" , "fangzhu" ]
}

「需要注意事项:」

1.「document是不可变的」,如果要修改document的内容,可以通过全量替换,直接对document重新建立索引,替换里面所有的内容。

2.es会将老的document标记为deleted(逻辑删除),然后新增我们给定的一个document,当我们创建越来越多的document的时候,es会在适当的时机在后台自动删除(物理删除)标记为deleted的document。

3.「替换必须带上所有的field,否则其他数据会丢失。」

ES的删除数据

语法:DELETE /Index名(数据库)/Type名(即表名)/Document名(一条记录的主键)

代码语言:javascript复制
DELETE /ecommerce/product/2

注意:在删除一个document之后,我们可以从侧面证明,它不是立即物理删除的,因为它的一些版本号信息还是保留的。

ES的基本查询

1、查询ES中所有的数据:
代码语言:javascript复制
GET /_search

返回结果如下:

「结果参数含义解析如下:」

1)took:耗费了几毫秒

2)timed_out:是否超时,false是没有,默认无timeout

3)_shards:shards fail的条件(primary和replica全部挂掉),不影响其他shard。默认情况下来说,一个搜索请求,会打到一个index的所有primary shard上去,当然了,每个primary shard都可能会有一个或多个replic shard,所以请求也可以到primary shard的其中一个replica shard上去。

4)hits.total:本次搜索,返回了几条结果

5)hits.max_score:score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也高

6)hits.hits:包含了匹配搜索的document的详细数据,默认查询前10条数据,按_score降序排序

7)hits.hits._index:Index名称(即数据库名)

8)hits.hits._type:Type名称(即表名)

9)hits.hits._id:Document名称(即行主键)

10)hits.hits._score:评分,(评分越高,表示匹配当前搜索越相关)

11)hits.hits._source:源数据,(添加的Json数据)

2、查询某数据表(Type)的所有记录
代码语言:javascript复制
GET /ecommerce/product/_search
{
  "query" : {
    "match_all" : {}
  }
}
### 其实这两种是一样的,因为ES在6.x版本调整了, 一个index只能存储一种type。
GET /ecommerce/_search
{
  "query" : {
    "match_all" : {}
  }
}
3、查询并排序
代码语言:javascript复制
## 查询名称包含yaogao的商品,同时按照价格降序排列
GET /ecommerce/product/_search
{
  "query" : {
    "match" : {
      "name" : "yagao"
    }
  },
  "sort" : [
    { "price" : "desc"}
    ]
}

4、分页查询
代码语言:javascript复制
#总共3条商品,假设每页就显示1条商品,现在显示第2页,所以就查出来第2个商品
GET /ecommerce/product/_search
{
  "query" : { "match_all" : {}},
  "from" : 1,
  "size" : 1
}
5、指定返回某项(列)
代码语言:javascript复制
GET /ecommerce/product/_search
{
  "query" : {"match_all" : {}},
  "_source" : ["name", "price"]
}
6、过滤查询
代码语言:javascript复制
#搜索商品名称包含yaogao,而且售价大于25元的商品
GET /ecommerce/product/_search
{
  "query" : {
    "bool" : {
      "must" : {
        "match" : {
          "name" : "yagao"
      }
  },
  "filter" : {
    "range" : {
      "price": {"gt" : 25}
        }
      }
    }
  }
}
7、search(全文检索)
代码语言:javascript复制
GET /ecommerce/product/_search
{
  "query" : {
    "match" : {
      "producer": "yagao producer"
    }
  }
}
8、短语搜索
代码语言:javascript复制
GET /ecommerce/product/_search
{
  "query" : {
    "match_phrase" : {
      "producer" : "yagao producer"
    }
  }
}

full-text search (全文检索)和 phrase search(短语搜索)的区别:

全文检索:会将输入的搜索串拆解开来,去索引里面去一一匹配,只要能匹配任意一个拆解后的单词,就可以作为结果返回。phrase search:要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算匹配成功,才能作为结果返回。

9、多条件查询
代码语言:javascript复制
## 名字中有yagao,描述上可以有fangzhu也可以没有,价格不能是25元
GET /ecommerce/_search
{
  "query" : {
    "bool" : {
      "must" : [
        {
          "match" : {
            "name" : "yagao"
          }
        }
        ],
        "should" : [
          {
            "match" : {
              "desc" : "fangzhu"
            }
          },
          {
            "match" : {
              "desc" : "caoben"
            }
          }
          ],
          "must_not" : [
            {
              "match" : {
                "price" :25
              }
            }
          ],
          "minimum_should_match" : 1
    }
  }
}

多条件查询中的字段描述:

must:  表示一定要满足;

should:  表示可以满足也可以不满足;

must_not:  表示不能满足该条件;

minimum_should_match:1 :表示最小匹配度,可以设置为百分之百,设置了这个值的时候就必须满足should里面的设置了,

另外注意这边should里面同一字段设置的多个值,意思是当这个值等于X或者等于Y都成立,务必注意格式。

总结

以上是对Elasticsearch的简单的增删改查做了一点点总结。简单的逻辑足够,但是有些需求需要比较复杂的查询,我们下次再学。

参考文章

https://www.cnblogs.com/liuqijia/p/11507494.html

0 人点赞