2.ELK之Elasticsearch常用DSL语句(kibana语句)

目录

什么是DSL ?

零、ES基本操作

1、查看索引/mapping

2、查看集群健康状态

3、查询ES中所有的index

4、删除索引

5、查看索引的分片情况

6、根据docid查询文档

7、常规查找——在/index/type中查找

8、限制查找条数

9、ES的基本CURD

一、ES高级查询 DSL

0、ES mapping中的数据类型

2、query DSL——查询所有(match_all)

3、query DSL——关键词查询(term)

4、query DSL——多关键词查询(terms)

5、query DSL——范围查询(range)

6、query DSL——前缀查询(prefix)

7、query DSL——通配符查询(wildcard)

8、query DSL——多id查询(ids)

9、query DSL——模糊查询(fuzzy)

10、query DSL——布尔查询(bool)  重要!!!!!

11、query DSL——match查询(match)   重要!!!!

注意文本匹配不要用term而应该用match~~~~

12、query DSL——should   

13、query DSL——multi_match查询(multi_match)   重要!!!!

14、query DSL——match_phrase查询(match_phrase)   重要!!!!

15、query DSL——查询是否包含某个字段(exists)

16、指定返回条数(size)

17、分页查询(from)

18、指定字段排序(sort)

19、指定返回字段(_source)

20、更多的查询命令: ES官网点击直达

21、理解相关性(relevance score)

二、Filter查询

三、聚合查询(Aggregation aggs)

四、条件更新/删除数据 —— _update_by_query/_delete_by_query

 1、条件删除数据

 2、条件更新数据


什么是DSL ?

DSL(Domain Specific Language)的缩写,中文翻译为领域特定语言

Wikipedia 对于 DSL 的定义还是比较简单的:

A specialized computer language designed for a specific task.

为了解决某一类任务而专门设计的计算机语言。

与 GPL 相对,DSL 与传统意义上的通用编程语言 C、Python 以及 Haskell 完全不同。通用的计算机编程语言是可以用来编写任意计算机程序的,并且能表达任何的可被计算的逻辑,同时也是 图灵完备 的。

但是在里所说的 DSL 并不是图灵完备的,它们的表达能力有限,只是在特定领域解决特定任务的。

A computer programming language of limited expressiveness focused on a particular domain.

另一个世界级软件开发大师 Martin Fowler 对于领域特定语言的定义在笔者看来就更加具体了,DSL 通过在表达能力上做的妥协换取在某一领域内的高效

而有限的表达能力就成为了 GPL 和 DSL 之间的一条界限。

零、ES基本操作

1、查看索引/mapping

GET /inde_name
GET /[index_name]/_mapping

#例如
GET /online_qd_analysis_202012
GET /online_qd_analysis_202012/_mapping

2、查看集群健康状态

GET /_cat/health
GET /_cat/health?v  #带"?v"就是列出列名的意思

 

3、查询ES中所有的index

GET _cat/indices
GET _cat/indices?v  #带"?v"就是列出列名的意思

4、删除索引

#删除指定索引
DELETE index_name

5、查看索引的分片情况

GET _cat/shards/index_name
GET _cat/shards/index_name?v

如上,每个分片是主副分片、状态、文档数、占用存储、ip等都一目了然。

6、根据docid查询文档

GET /index_name/type_name/docid

#例如
GET /online_qd_analysis_202012/kw/corp_uin_2852156690_2852156690_1442795696_1608777956283

7、常规查找——在/index/type中查找

 注:_search的含义是在所有数据中查找。

#指定index和type;就是在这个type_name中查找的意思
GET index_name/type_name/_search
{
  "size":30,
  "query":{


   }
}

#指定index
GET index_name/_search
{
  "size":30,
  "query":{


   }
}

8、限制查找条数

#限制查找条数有两种方式.1)在get语句中限定 2)在内部参数中限定
#1)GET语句中限定
GET index_name/type_name/_search?size=100
{
  "query": {
        "match": {
            "session_id": 
        }
    }
}

#2)内部参数限定
GET index_name/type_name/_search
{
  "size":3,
  "query": {
        "match": {
            "session_id": 
        }
    }
}

具体规则可以参见:  CSDN

9、ES的基本CURD

下面以一个电商的例子,说明下es的增删改查。

(1)、插入一条数据

 指定docid,POST/PUT都可以;不指定docid,貌似只能POST。

#PUT操作插入一条数据
PUT /my_index/my_type/docid1111
{
    "name":"dior chengyi",
    "desc":"shishang gaodang",
    "price":7000,
    "producer":"dior producer",
    "tags":["shishang","shechi"]
}


#ES7及以后版本有所变更,格式如下。
PUT /my_index/_doc/docid1111
{
    "name":"dior chengyi",
    "desc":"shishang gaodang",
    "price":7000,
    "producer":"dior producer",
    "tags":["shishang","shechi"]
}

注:es7以后格式为"PUT /index_name/_doc/",其中的_doc是必须的标识对文档的操作。


#ES7及以后  不指定docid
PUT /my_index/_doc/
{
    "name":"dior chengyi",
    "desc":"shishang gaodang",
    "price":7000,
    "producer":"dior producer",
    "tags":["shishang","shechi"]
}

注:es7以后格式为"PUT /index_name/_doc/",其中的_doc是必须的标识对文档的操作。

注:es7之后版本都要将type位置换成“_doc”;其实就是ES7将_doc作为默认type了。

(2)、根据docid查询某条记录

#根据docid查询商品
GET /my_index/my_type/docid1111

GET /my_index/_doc/docid1111

(3)、根据其他字段查询记录

GET /my_index/my_type/_search
{
	"size":5,
	"query":{
		"match":{
			"name":"dior chengyi"
		}
	}
}

#es7及之后版本
GET /my_index/_doc/_search
{
	"size":5,
	"query":{
		"match":{
			"name":"dior chengyi"
		}
	}
}

(4)、修改数据

(1)PUT方式修改字段——其他字段依然带上

#把price改成8000.如下是ok的
PUT /my_index/my_type/docid1111
{
	"name":"dior chengyi",
	"desc":"shishang gaodang",
	"price":8000,
	"producer":"dior producer",
	"tags":["shishang","shechi"]
}

(2)PUT方式仅涉及修改字段——其他字段不带上(会覆盖原来所有)

#这样update是不行的.会把docid1111完全覆盖掉
PUT /my_index/my_type/docid1111
{
	"price":9000
}

(3)POST/_update方式修改数据——比较理想的方法

注:先进行查询,查询后存储doc,然后在更新其中的指定的字段的字段值。

#POST方式进行update.注意:"_update"、"doc"等都要有
POST /my_index/my_type/docid1111/_update
{	
	"doc":{
		"price":8500
	}
}

POST /my_index/_doc/docid1111/_update
{	
	"doc":{
		"price":8500
	}
}

5、删除商品数据

#删除商品数据
DELETE /my_index/my_type/docid1111

6、继续插入两条数据

#再插入一条记录
PUT /my_index/my_type/docid1112
{
	"name":"hailanzhijia chenyi",
	"desc":"shangwu xiuxian",
	"price":200,
	"producer":"hailanzhijia producer",
	"tags":["xiuxian"]
}

#在插入一条记录
PUT /my_index/my_type/docid1113
{
	"name":"uniqlo chenyi",
	"desc":"jujia xiuxian",
	"price":150,
	"producer":"uniqlo producer",
	"tags":["jujia","xiuxian"]
}

7、查看所有数据

#查看所有数据
GET /my_index/my_type/_search

GET /my_index/_doc/_search

一、ES高级查询 DSL

0、ES mapping中的数据类型

字符串类型: keyword、text
数字类型: interger long
小数类型: float double
布尔类型: boolean
日期类型: date

①keyword一般用于关键字/词;text存储一段文本。本质区别是text会分词,keyword不会分词;

②所有类型中只有text类型会分词,其余都不分词;

③默认情况ES使用标准分词器。其分词逻辑为:中文单字分词、英文单词分词。


为了便于后续测试创建如下索引
PUT products
{
  "settings":{
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings":{
    "properties": {
      "id":{
        "type":"integer"
      },
      "title":{
        "type":"keyword"
      },
      "price":{
        "type":"double"
      },
      "create_at":{
        "type":"date"
      },
      "description":{
        "type":"text"
      }
    }
  }
}

注:discription字段以下形式即为指定分词器
      "description":{
        "type":"text",
        "analyzer": "ik_max_word"
      }


#并插入如下数据

POST /products/_doc/1
{
  "id":1,
  "title":"小浣熊",
  "price":0.5,
  "create_at":"2022-11-11",
  "description":"小浣熊很好吃!!"
}


POST /products/_doc/2
{
  "id":2,
  "title":"唐僧肉",
  "price":1.0,
  "create_at":"2022-11-11",
  "description":"唐僧肉真不错!!很好吃!!"
}

POST /products/_doc/8
{
  "id":8,
  "title":"大辣片",
  "price":1.0,
  "create_at":"2022-11-11",
  "description":"大辣片好好吃!!很好吃!!"
}

POST /products/_doc/
{
  "title":"大鸡腿",
  "price":10,
  "create_at":"2022-11-11",
  "description":"good chicken"
}

POST /products/_doc/
{
  "title":"日本豆",
  "price":1.5,
  "create_at":"2022-11-11",
  "description":"日本豆很好吃!!"
}

POST /products/_doc/
{
  "title":"鱼豆腐",
  "price":3.5,
  "create_at":"2022-11-11",
  "description":"鱼豆腐nice!!很好吃!!"
}


1、语法

#注:ES7之前_doc为实际type,之后为_doc;不过查询的时候_doc可省略。
GET /索引名/_doc/_search 
{
    json格式请求体数据
}

或者省略_doc(建议)
GET /索引名/_search 
{
    json格式请求体数据
}

注:建议查询的时候直接省略_doc,这个时候还会有自动补齐提示。

2、query DSL——查询所有(match_all)

 match_all关键字:返回索引中的全部文档。

GET /products/_search
{
  "query":{
    "match_all": {}
  }
}


注:既然是match_all后面肯定不需要限定任何条件了;但是为了满足json格式所以这里要加个"{}"

3、query DSL——关键词查询(term)

重复三遍:文本匹配不要用term!文本匹配不要用term!文本匹配不要用term!(要用match) 

term关键词:用来使用关键词查询。

①term搜索映射中的keyword类型应当使用全部内容搜索(如“大辣片”);

②text类型默认ES使用标准分词器;其分词逻辑为 对英文单词分词、对中文单字分词。

#keyword搜索完整关键词是能够搜到的
GET /products/_search
{
  "query":{
    "term": {
      "title": "鱼豆腐"
    }
  }
}


注:上述描述json格式的K-V都可以换成如下。
"title":{
  "value":"鱼豆腐"
}


#默认分词器下text搜索完整内容也是搜不到的
GET /products/_search
{
  "query":{
    "term": {
      "description": "日本豆很好吃!!"
    }
  }
}

#默认分词器下text搜索单个汉字是能搜到的
GET /products/_search
{
  "query":{
    "term": {
      "description": "好"
    }
  }
}

#默认分词器下text搜索单个英文单词也是能搜到的
GET /products/_search
{
  "query":{
    "term": {
      "description": "nice"
    }
  }
}

4、query DSL——多关键词查询(terms)

terms关键词:用于某个关键词匹配多个值的查询。和 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配。


GET /products/_search
{
  "query":{
    "terms": {
      "title": [
        "大鸡腿",
        "大辣片"
      ]
    }
  }
}

5、query DSL——范围查询(range)

range关键字:用来指定查询范围内的文档

#查询加个范围

GET /products/_search
{
  "query":
  {
    "range": {
      "price": {
        "gte": 5,
        "lte": 10
      }
    }
  }
}

6、query DSL——前缀查询(prefix)

prefix关键字:用来检索含有指定前缀的关键词的相关文档。

#针对keyword类型是可以前缀查询到的
GET /products/_search
{
  "query":{
    "prefix": {
      "title": {
        "value": "小浣"
      }
    }
  }
}

#针对text类型如果是英文的话也是可以前缀查到的
GET /products/_search
{
  "query":{
    "prefix": {
      "description": {
        "value": "goo"
      }
    }
  }
}<
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

焱齿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值