ES命令操作(Rest风格说明)
文章目录
- 五、ES命令操作(Rest风格说明)
- 5.1、基本Rest命令说明
- 5.2、关于索引的基本操作
- 5.2.1、创建一个索引,添加
- 5.2.2、字段数据类型
- 5.2.3、指定字段的类型(使用PUT)
- 5.2.4、获取建立的规则信息
- 5.2.5、获取默认信息
- 5.2.6、修改
- ①旧的(使用put覆盖原来的值)
- ②新的(使用post的update)
- 5.2.7、删除
- 5.3、关于文档(行记录)的基本操作
- 5.3.1、查询(简单条件)
- 5.3.2、复杂查询
- ①匹配查询
- ②布尔值查询、多条件匹配查询(bool)
- ③匹配数组,匹配一个字段的多个条件
- ④精确查询
- ⑤text和keyword 类型对比
- ⑥高亮查询
五、ES命令操作(Rest风格说明)
一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
5.1、基本Rest命令说明
method | url地址 | 描述 |
---|---|---|
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
}
5.2.2、字段数据类型
-
字符串类型
-
text、keyword
- text:支持分词 ,全文检索,支持模糊、精确查询,不支持聚合,排序操作:text类型的最大支持的字符长度无限制,适合大字段存储;
- keyword:不支持分词 ,直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。
-
-
数值型
- long、Integer、short、byte、double、float、half float、scaled float
-
日期类型
- date
-
布尔类型
- boolean
-
二进制类型
- binary
-
等等…
5.2.3、指定字段的类型(使用PUT)
类似于建库(建立索引和字段对应类型),也可看做规则的建立
PUT /test2
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age":{
"type": "long"
},
"birthday":{
"type": "date"
}
}
}
}
5.2.4、获取建立的规则信息
可以通过GET请求获取具体的信息
GET test2
5.2.5、获取默认信息
_doc
默认类型(default type),type 在未来的版本中会逐渐弃用,因此产生一个默认类型进行代替
PUT /test3/_doc/1
{
"name": "流柚",
"age": 18,
"birth": "1999-10-10"
}
GET test3
如果自己的文档字段没有被指定,那么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
②新的(使用post的update)
- version会改变
- 需要注意doc
- 不会丢失字段
POST /test3/_doc/1/_update
{
"doc":{
"name" : "post修改,version不会加一",
"age" : 2
}
}
GET /test3/_doc/1
5.2.7、删除
GET /test1
DELETE /test1
5.3、关于文档(行记录)的基本操作
5.3.1、查询(简单条件)
# 最简单的查询,类似与数据库通过id来查询。
GET /test3/_doc/1GET /test3/_doc/_search?q=name:流柚
注意结果中的 “_score” 为匹配度,匹配度越高则分值越高,位置越靠前,就是权重的意思
还有 hits字段,在java中有对应的对象,它包含了:
- 索引和文档的信息
- 查询的结果总数
- 然后就是查询出来的具体的文档(行记录),数据中的东西都可以遍历出来了
5.3.2、复杂查询
blog索引中的内容
①匹配查询
-
_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
}
②布尔值查询、多条件匹配查询(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
}
}
}
}
}
}
③匹配数组,匹配一个字段的多个条件
- 貌似不能与其它字段一起使用
- 可以多关键字查(空格隔开),只要满足其中一个结果就可以被查出来
match
会使用分词器解析(先分析文档,然后进行查询)- 搜词
// 匹配数组 貌似不能与其它字段一起使用
// 可以多关键字查(空格隔开)
// match 会使用分词器解析(先分析文档,然后进行查询)
GET /blog/user/_search
{
"query": {
"match": {
"desc": "年龄 牛 大"
}
}
}
④精确查询
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": "我"
}
}
}
}
}
⑤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": {}
}
}
}
羁绊徒增负担: 可重复读不是一种隔离机制吗,为什么归类在问题里面,这个不太理解
一棵纯白菜: 写的太强了,格式设计一绝,可读性很高赞
CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性。
CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性;(2)使用更多的站内链接。
CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)使用更多的站内链接;(2)提升标题与正文的相关性。