目录
10、query DSL——布尔查询(bool) 重要!!!!!
11、query DSL——match查询(match) 重要!!!!
13、query DSL——multi_match查询(multi_match) 重要!!!!
14、query DSL——match_phrase查询(match_phrase) 重要!!!!
15、query DSL——查询是否包含某个字段(exists)
四、条件更新/删除数据 —— _update_by_query/_delete_by_query
什么是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"
}
}
}
}<