ES命令操作(Rest风格说明)

ElasticSearch目录


五、ES命令操作(Rest风格说明)

一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁更有层次更易于实现缓存等机制。

5.1、基本Rest命令说明

methodurl地址描述
PUT(创建,修改)localhost:9200/索引名称/类型名称/文档id创建文档(指定文档id)
POST(创建)localhost:9200/索引名称/类型名称创建文档(随机文档id)
POST(修改)localhost:9200/索引名称/类型名称/文档id/_update修改文档
DELETE(删除)localhost:9200/索引名称/类型名称/文档id删除文档
GET(查询)localhost:9200/索引名称/类型名称/文档id查询文档通过文档ID
POST(查询)localhost:9200/索引名称/类型名称/文档id/_search查询所有数据

5.2、关于索引的基本操作

5.2.1、创建一个索引,添加

PUT /索引名称/类型名称/文档id
{请求体}

PUT /test1/type1/1
{  
	"name" : "流柚",  
	"age" : 18
}

img

img

5.2.2、字段数据类型

  • 字符串类型

    • text、keyword

      • text:支持分词 ,全文检索,支持模糊、精确查询,不支持聚合,排序操作:text类型的最大支持的字符长度无限制,适合大字段存储;
      • keyword:不支持分词 ,直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。
  • 数值型

    • long、Integer、short、byte、double、float、half floatscaled float
  • 日期类型

    • date
  • 布尔类型

    • boolean
  • 二进制类型

    • binary
  • 等等…

5.2.3、指定字段的类型(使用PUT)

类似于建库(建立索引和字段对应类型),也可看做规则的建立

PUT /test2
{  
    "mappings": {
        "properties": {
            "name": {
                "type": "text"      
            },
            "age":{
                "type": "long"      
            },
            "birthday":{
                "type": "date"      
            }    
        }  
    }
}

img

5.2.4、获取建立的规则信息

可以通过GET请求获取具体的信息

GET test2

img

5.2.5、获取默认信息

_doc 默认类型(default type),type 在未来的版本中会逐渐弃用,因此产生一个默认类型进行代替

PUT /test3/_doc/1
{  
	"name": "流柚",  
    "age": 18,  
    "birth": "1999-10-10"
}

GET test3

img

如果自己的文档字段没有被指定,那么ElasticSearch就会给我们默认配置字段类型。
如上图:通过命令 GET test3,查看索引test3中的字段默认类型,其中name字段的类型是text,但是该字段的关键字切分却是keyword类型,即不能分割。所以建议:在创建索引时,指明字段的类型与拆分规则,如下命令:

PUT /test3
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text",
        "analyzer": "ik_max_word"  // ik分词器-最细粒度拆分
        //这样在搜索的时候,才会匹配到我们需要的结果
      }
    }
  }
}


扩展:通过get _cat/ 可以获取ElasticSearch的当前的很多信息!

GET _cat/indices
GET _cat/aliases
GET _cat/allocation
GET _cat/count
GET _cat/fielddata
GET _cat/health
GET _cat/indices
GET _cat/master
GET _cat/nodeattrs
GET _cat/nodes
GET _cat/pending_tasks
GET _cat/plugins
GET _cat/recovery
GET _cat/repositories
GET _cat/segments
GET _cat/shards
GET _cat/snapshots
GET _cat/tasks
GET _cat/templates
GET _cat/thread_pool

5.2.6、修改

两种方案

①旧的(使用put覆盖原来的值)
  • 版本+1(_version)
  • 但是如果漏掉某个字段没有写,那么更新时没有写的字段 ,会消失
PUT /test3/_doc/1
{
	"name" : "流柚是我的大哥",  
	"age" : 18,  
	"birth" : "1999-10-10"
}

GET /test3/_doc/1

// 修改会有字段丢失
PUT /test3/_doc/1
{  
    "name" : "流柚"
}

GET /test3/_doc/1

img

img

②新的(使用post的update)
  • version会改变
  • 需要注意doc
  • 不会丢失字段
POST /test3/_doc/1/_update

{  
    "doc":{
        "name" : "post修改,version不会加一",
        "age" : 2  
    }
}

GET /test3/_doc/1

img

5.2.7、删除

GET /test1
DELETE /test1

img

img

5.3、关于文档(行记录)的基本操作

5.3.1、查询(简单条件)

# 最简单的查询,类似与数据库通过id来查询。
GET /test3/_doc/1GET /test3/_doc/_search?q=name:流柚

注意结果中的 “_score” 为匹配度,匹配度越高则分值越高,位置越靠前,就是权重的意思

还有 hits字段,在java中有对应的对象,它包含了:

  • 索引和文档的信息
  • 查询的结果总数
  • 然后就是查询出来的具体的文档(行记录),数据中的东西都可以遍历出来了

img

5.3.2、复杂查询

blog索引中的内容

img

①匹配查询
  • _search :指明查询操作

  • query :构造查询条件

  • match:匹配(会使用分词器解析(先分析文档,然后进行查询))

  • _source:过滤字段,指定要查询出来哪几个字段信息

  • sort:排序,根据哪个字段排序,注意有此条件时,查询结果中"_score" 为null

  • 分页查询: form (从第几个开始)、size (每页大小)

// 查询匹配
  GET /blog/user/_search
  {        
  	"query":{
  	        "match":{
  	               "name":"流"
  	         }        
  	 },
  	 "_source": ["name","desc"]    
  	 ,        
  	 "sort": [        
	  	 {            
		  	 "age": {                
		  	 	"order": "asc"            
		  	 }              
		 }        
	 ]    
	 ,        
	 "from": 0        
	 ,        
	 "size": 1  
   }

img

②布尔值查询、多条件匹配查询(bool)
  • must 相当于 and
  • should 相当于 or
  • must_not 相当于 not
  • filter 过滤(范围查询)
///  bool 多条件查询
 must <==> and
 should <==> or
 must_not <==> not 不等于
 filter数据过滤  (gte >=   lte <=)
 boost
 minimum_should_match
GET /blog/user/_search
{
	"query": {
		"bool": {
			"must": [
				{
					"match": {
						"age": 3
					}
				}, {
					"match": {
						"name": "流"
					}
				}
			],
			"filter": {
				"range": {
					"age": {
						"gte": 1,
						"lte": 3
					}
				}
			}
		}
	}
}

img

③匹配数组,匹配一个字段的多个条件
  • 貌似不能与其它字段一起使用
  • 可以多关键字查(空格隔开),只要满足其中一个结果就可以被查出来
  • match 会使用分词器解析(先分析文档,然后进行查询)
  • 搜词
// 匹配数组 貌似不能与其它字段一起使用
// 可以多关键字查(空格隔开)
// match 会使用分词器解析(先分析文档,然后进行查询)
GET /blog/user/_search
{
	"query": {
		"match": {
			"desc": "年龄 牛 大"
		}
	}
}

img

④精确查询
  • term 直接通过 倒排索引 指定 词条 查询 (可以和 match 对比一下)
    • term ,直接查询精确的
    • match,会使用分词器解析! (先分析文档,然后在通过分析的文档进行查询! )
  • 关于分词:适合查询 类型 为 number、date、keyword ,不适合字段类型为 text
// 精确查询(必须全部都有,而且不可分,即按一个完整的词查询)
// term 直接通过 倒排索引 指定的词条 进行精确查找的
GET /blog/user/_search
{	
	"query": {
		"term": {
			"desc": "年" 
            //查询“desc”字段中 带有“年”这个字的记录   
        }  
    }
}

//利用term 进行多条件查询
//查询desc字段中含有 “年” 或者 “我”的记录
GET /blog/user/_search
{
	"query": {
		"bool": {
			"should": {
				"term": {
					"desc": "年"
				},
				"term": {
					"desc": "我"
				}
			}
		}
	}
}

img

⑤text和keyword 类型对比
  • text:
    • 支持分词全文检索、支持模糊、精确查询,不支持聚合,排序操作;
    • text类型的最大支持的字符长度无限制,适合大字段存储;
  • keyword:
    • 不进行分词,不会被分词器解析直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。
    • keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果
// 测试keyword和text是否支持分词
// 设置索引类型
PUT /test
{
	"mappings": {
		"properties": {
			"text": {
				"type": "text"
			},
			"keyword": {
				"type": "keyword"
			}
		}
	}
}

// 设置字段数据
PUT /test/_doc/1
{  
	"text":"测试keyword和text是否支持分词",
  	"keyword":"测试keyword和text是否支持分词"
}

// text 支持分词
// keyword 不支持分词
GET /test/_doc/_search
{
	"query": {
		"match": {
			"text": "测试"
		}
	}
}
// 查的到

GET /test/_doc/_search
{
	"query": {
		"match": {
			"keyword": "测试"
		}
	}
}
// 查不到,必须是 "测试keyword和text是否支持分词" 才能查到

GET _analyze
{
	"analyzer": "keyword",
	"text": ["测试liu"]
}

// 不会分词,即 测试liu
GET _analyze
{  
	"analyzer": "standard",
	 "text": ["测试liu"]
}
// 分为: 测 试 liu

GET _analyze
{  
	"analyzer":"ik_max_word",  
	"text": ["测试liu"]
}
// 分为: 测试 liu
⑥高亮查询
/// 高亮查询
GET blog/user/_search
{
	"query": {
		"match": {
			"name": "流"
		}
	},
	"highlight": {
		"fields": {
			"name": {}
			// 查询出来的结果,name字段高亮显示   
        }  
    }
}

// 自定义前缀和后缀 的高亮查询 (自定义的前缀和后缀 会替换默认的<em></em>)
GET blog/user/_search
{
	"query": {
		"match": {
			"name": "流"
		}
	},
	"highlight": {
		"pre_tags": "<p class='key' style='color:red'>",
		"post_tags": "</p>",
		"fields": {
			"name": {}
		}
	}
}

img

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悬浮海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值