临近考试,浅浅记个笔记。
ES索引请求
- PUT:创建索引
- GET:查看索引
- DELETE:删除索引
- HEAD:检验索引存在性
创建索引
- settings设置
1、number_of_shards:每个索引的主分片数,默认值是5 。这个配置在索引创建后不能修改。
2、number_of_replicas:每个主分片的副本数,默认值是1 。对于活动的索引库,这个配置可以随时修改。
PUT /product
{
"settings": {
"number_of_shards": 3,
"number_of_replicas" : 1
}
}
- 索引数据类型
1、字符串类型:
··string
··text
··keyword
PS:从ElasticSearch 5.x开始不再支持string,由text和keyword类型替代。
2、整数类型:
··long
··integer
··short
··byte
3、浮点类型:
··double
··float
··half_float
··scaled_float
4、逻辑类型:
··boolean
5、日期类型:
··date
6、范围类型:
··range
7、二进制类型:
··binary
8、复合类型数组类型:
··对象类型array
··JSON格式对象数据object
··嵌套类型nested
··地理类型地理坐标类型geo_point
··地理地图geo_shape
··特殊类型IP类型
··范围类型completion
··令牌计数类型token_count
··附件类型attachment
··抽取类型percolator - mapping映射
1、动态映射,即不事先指定映射类型(Mapping)。
2、dynamic 属性有三种取值:
①true,默认即此。自动添加新字段。
②false,忽略新字段。
③strict,严格模式,发现新字段会抛出异常。
创建索引例子
创建一个名为product的索引,索引分片数为3,副本数为1。映射字段为code(keyword类型),name(text类型),price(double类型),psDate(date类型),category(int类型),address(text类型)。
PUT /product
{
"settings": {
"number_of_shards":3,
"number_of_replicas":1
},
"mappings":{
"dynamic":"strict",
"properties": {
"code":{
"type":"keyword"
},
"name":{
"type":"text"
},
"price":{
"type":"double"
},
"psDate":{
"type":"date"
},
"category":{
"type":"integer"
},
"address":{
"type":"text"
}
}
}
}
这里要注意逗号,该加的必须要加上去,不该加的一定不能加。
索引创建成功后可由下面代码查看索引信息:
GET /product/_settings
查看索引映射信息:
GET /product/_mappings
修改设置
- 修改索引副本分片个数:
PUT product/_settings
{
"settings":{
"number_of_replicas":2
}
}
索引字段可以添加;
索引字段一旦定义之后,是无法修改的;
索引字段一旦添加不可删除。
PUT product/_mapping
{
"properties":{
"message":{
"type":"text"
}
}
}
索引数据的插入
通过PUT 或者POST 请求方法实现。这里使用PUT方法。
- _index:索引
- _type:类型(es7以后,一个索引只含有一个固定的type,即:_doc)
- _id:id仅仅是一个字符串,它与_index和_type组合时,就可以在Elasticsearch中唯一标识一个文档。当创建一个文档,你可以自定义_id,也可以让Elasticsearch帮你自动生成。
语法格式:
PUT /{INDEX}/{TYPE}/{ID}
{
"field":"value",
.......
}
不写id的话,Elasticsearch会自动创建id。
文档索引的添加还可以通过PUT+_create参数创建,该方法创建的文档需指定id,如果id所在的文档已存在,则报错;否则,则添加成功。
PUT /{index}/_create/{ID}
{
"field": "value"
}
接上述 创建索引例子 ,给product索引添加文档信息,如下:
PUT /product/_doc/1
{
"code":1001,
"name":"西瓜,鲜甜可口",
"price":10,
"psDate":"2022-05-31",
"category":1,
"address":"jiangsu wuxi"
}
小总结:
- PUT命令:如果ID在文档中不存在,则新增该条记录,如果ID已存在,则覆盖原有内容,并通过version递增1标识。
- POST命令:如果提供ID,效果同PUT命令;如果不提供ID,则自动提供一个GUID,并作为新记录存入ES。
- 使用PUT+_create参数:指定本记录为新增记录,如果ID已经存在,则报错;如果ID不存在,则添加成功。
索引数据的更新
①使用PUT提交一个相同ID的记录即可:原有记录删除,版本号递增1,新内容作为原有ID的内容;所有字段数据相当于被删除,然后重新添加。
接上面的代码,修改想要修改的信息,再运行一下即可。(这里修改了price)
PUT /product/_doc/1
{
"code":1001,
"name":"西瓜,鲜甜可口",
"price":5.5,
"psDate":"2022-05-31",
"category":1,
"address":"jiangsu wuxi"
}
②通过POST命令+Update参数修改原有文档
当有数据发生变化时,版本号会变化,无修改内容,则无变化。
字段重复的内容直接覆盖,字段不重复则追加。
POST /product/_update/1
{
"doc":{
"code":1001,
"name":"西瓜,鲜甜可口",
"price":5.5,
"psDate":"2022-05-31",
"category":1,
"address":"jiangsu wuxi"
}
}
③尽管使用PUT 和POST方法请求文档可以更新文档,但必须要知道文档的_id
字段值。
如果不知道文档ID,那么就要用到根据查询条件进行更新的_update_by_query
接口了。该接口使用POST方法请求,并通过query
参数接收查询条件。
PUT /product/_update_by_query
{
"script":{
"code":1001,
"name":"西瓜,鲜甜可口",
"price":5.5,
"psDate":"2022-05-31",
"category":1,
"address":"jiangsu wuxi"
},
"query":{
"term":{
"code":1001
}
}
}
获取索引信息(检索文档)
- 在index1和index2索引中搜索所有的文档
GET /index1,index2/_search
- 在任何以g或者u开头的索引中搜索所有的类型
GET /g*,u*/_search
- 通过_search获取某个索引中所有文档信息,包括索引信息;
GET /{index}/_search
- 通过_id 值获取单个文档信息;
HEAD 方法用于存在性校验,返回结果通过状态码200 和404 表示文档是否存在。
HEAD /my_index/_doc/{id}
GET 方法返回结果包含了文档的基本信息,代码如下:
GET /{index}/_doc/{id}
- 通过
_mget
接口根据多个_id
获取多个文档
如果想要根据一组_id
值查看多个文档,可以使用_mget
接口实现。
_mget
接口根据索引名称和文档ID 获取多个文档,可以使用GET 或POST 方法请求该接口。
在请求地址中可以指定一个或者多个索引,也可以不包含索引。
_mget
接口可以使用_source
参数指定获取哪些字段,但不是在请求路径中使用,而是在docs
中与_index
、_id
等参数一起使用。
基于URI——分页
如果每页展示5 条结果,可以用下面方式请求得到1 到3 页的结果:
GET/_search?size=5
GET/_search?size=5&from=5
GET/_search?size=5&from=10
基于URI——条件搜索
查询文档中字段内容为20的文档数据:
GET /product/_search?q=20
查询文档中字段内容以02结尾的文档数据:
GET /product/_search?q=*02
指定某个或某些字段查询:
查询文档中字段age=28的文档数据:
GET /customer/_search?q=age:28
查询sex=1的数据并按照age升序排序:
GET /_search?q=sex:1&sort=age:asc
其他
查询商品编号code为2001的商品信息。
GET product/_search
{
"query": {
"term": {
"code": "2001"
}
}
}
查询价格取值范围再50-100之间的商品信息。
GET product/_search
{
"query": {
"range": {
"price": {
"gte": 50,
"lte": 100
}
}
}
}
查询产地address属于beijing或者zhejiang的商品信息。
GET product/_search
{
"query": {
"bool": {
"should": [
{"match": {
"address": "beijing"
}},
{"match": {
"address": "zhejiang"
}
}
]
}
}
}
查询商品价格在50-100之间,且category包含2和3的商品信息。
GET product/_search
{
"query": {
"bool": {
"must": [
{"range": {
"price": {
"gte": 50,
"lte": 100
}
}},
{
"terms": {
"category": [
"2",
"3"
]
}
}
]
}
}
}
按种类category统计商品产地为jiangsu或者zhejiang的商品价格的平均值,最大值,最小值。
GET product/_search
{
"size":0,
"query": {
"bool": {
"should": [
{"match": {
"address": "beijing"
}},
{"match": {
"address": "zhejiang"
}
}
]
}
},
"aggs": {
"aggs_category": {
"terms": {
"field": "category"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
},
"max_price":{
"max": {
"field": "price"
}
},
"min_price":{
"min": {
"field": "price"
}
}
}
}
}
}
统计每月进货商品的总价格和个数。并按照日期从小到大排序。
GET product/_search
{
"size": 0,
"aggs": {
"aggs_date": {
"date_histogram": {
"field": "psDate",
"calendar_interval": "month",
"format": "yyyy-MM",
"order": {
"_key": "desc"
}
},
"aggs": {
"sum_price": {
"sum": {
"field": "price"
}
},
"count_date":{
"value_count": {
"field": "psDate"
}
}
}
}
}
}
索引的删除
DELETE product
DELETE product/_doc/4
根据查询条件找到满足条件的文档并删除。
POST /product/_delete_by_query
{
"query":{
"term":{
"productCode":"1002"
}
}
}