【ElasticSearch】之常用 HTTP 请求命令

目录

  • 1、通过 RESTful 访问 ElasticSearch
  • 2、添加索引
  • 3、访问索引
  • 4、访问所有索引信息
  • 5、删除索引
  • 6、给索引添加文档数据
  • 7、给索引添加文档数据并指定 ID
  • 8、根据ID获取文档数据
  • 9、获取指定索引下的所有文档数据
  • 10、全量修改文档数据
  • 11、修改文档的局部数据
  • 12、删除文档数据
  • 13、条件查询
  • 14、分页查询
  • 15、指定返回字段
  • 16、查询结果排序
  • 17、多条件查询和范围查询
  • 18、全文检索
  • 19、完全匹配
  • 20、高亮显示结果
  • 21、聚合查询
  • 22、映射关系

1、通过 RESTful 访问 ElasticSearch


curl -X GET http://localhost:9200
  • ElasticSearch 的 RESTful 端口为 9200

2、添加索引


curl -X PUT http://localhost:9200/demo
  • 添加索引使用的是 PUT 请求,域名地址后面的 demo 就是要添加的索引名称;
  • PUT 请求操作结果是幂等性的,意思是多次相同的请求结果是一样的,所以,再次执行该请求时会报错提示索引已存在了。

3、访问索引


curl -X GET http://localhost:9200/demo
  • 访问索引使用的是 GET 请求,域名地址后面的 demo 就是所要访问的索引名称。

4、访问所有索引信息


curl -X GET http://localhost:9200/_cat/indices?v
  • 域名地址后面紧跟的 _catES 的请求命令,表示查看文档;
  • -v 参数表示把所有信息详细地展示出来。

5、删除索引


curl -X DELETE http://localhost:9200/demo
  • 删除索引使用 DELETE 请求,域名地址后面紧跟要删除的索引名称。

6、给索引添加文档数据


curl -X POST http://localhost:9200/demo/_doc -d "{\"name\": \"hello\"}" -H "content-type: application/json; charset=UTF-8"
  • _doc 命令表示添加文档数据,可以换成 _create
  • 请求方式为 POST,必须包含请求体 body,请求体格式为 JSON 格式;
  • POST 请求不是幂等性的操作,多次相同的请求互不影响(ES 会生成不同的 _id)。

返回内容如下:

{
    "_index": "demo",
    "_type": "_doc",
    "_id": "KL8xSnsBZDsVkmfG6wXh",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 1,
    "_primary_term": 1
}
  • 返回的 _idES 随机生成的 ID。

7、给索引添加文档数据并指定 ID


curl -X POST http://localhost:9200/demo/_doc/1001 -d "{\"name\": \"hello\"}" -H "content-type: application/json; charset=UTF-8"
  • 指定 ID 的方式为:在请求末尾添加 ID 值;

返回内容如下:

{
	"_index": "demo",
	"_type": "_doc",
	"_id": "1001",
	"_version": 1,
	"result":"created",
	"_shards": {
		"total": 2,
		"successful": 1,
		"failed":0
	},
	"_seq_no": 2,
	"_primary_term": 1
}
  • 从返回结果可以看到,文档数据中的 _id 使用了我们提供的 ID 值;
  • 如果指定了 ID 值,则不允许多次创建该 ID 值的文档数据。

8、根据ID获取文档数据


curl -X GET http://localhost:9200/demo/_doc/1001

9、获取指定索引下的所有文档数据


curl -X GET http://localhost:9200/demo/_search
  • 域名地址后面紧跟的就是所要获取的索引名;
  • 使用 _search 命令获取所有文档数据。

10、全量修改文档数据


curl -X PUT http://localhost:9200/demo/_doc/1001 -d "{\"name\": \"java\"}" -H "content-type: application/json; charset=UTF-8"
  • 该请求表示:使用 PUT 请求发送 _doc 命令修改 ID 值为 1001 的文档数据;
  • 请求会直接覆盖 ID 值为 1001 的文档数据的全部内容。

返回结果会提示我们该请求为更新 update 操作:

{
    "_index": "demo",
    "_type": "_doc",
    "_id": "1001",
    "_version": 3,
    "result": "updated",
}

11、修改文档的局部数据


curl -X POST http://localhost:9200/demo/_update/1001 -d "{\"doc\": {\"name\": \"Ruby\"}}" -H "content-type: application/json; charset=UTF-8"
  • 由于每次修改局部数据的操作结果都是不同的,所以它不是幂等性的,既然不是幂等性的话,我们就选择使用 POST 请求,而不是 PUT 请求;
  • 由于使用的是 POST 请求,所以需要使用 _update 命令,而不能使用 _doc 命令,因为 _doc 命令会被认为是创建文档数据;
  • 局部数据的 JSON 格式固定为:{"doc": {key: value}},在 doc 中指定要修改的字段即可。

12、删除文档数据


curl -X DELETE http://localhost:9200/demo/_doc/1001
  • 删除请求使用的是 _doc 命令、DELETE 请求。

13、条件查询


1、使用请求路径参数:

curl -X GET http://localhost:9200/demo/_search?q=name:wang
  • 请求表示查询所有 name 字段值为 "wang" 的文档数据,搜索结果会列出所有匹配的数据;
  • 使用请求路径参数的方式会比较麻烦,并且如果路径中包含中文的话容易出出现乱码现象。

2、使用请求体:

curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体中我们使用如下数据:

{
	"query": {
		"match": {
			"name": "wang"
		}
	}
}
  • "query" 表示查询,"match" 表示匹配,里面填写要匹配的字段值;
  • 这里的请求数据表示:查询 namewang 的所有文档数据。

如果要查询所有数据,请求体可以改成如下:

{
	"query": {
		"match_all": {
		}
	}
}

14、分页查询


curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体数据如下:

{
	"query": {
		"match_all": {
		}
	},
	"from": 0,
	"size": 1
}
  • "from" 参数表示从第几条数据开始;
  • "size" 参数表示获取多少条数据。

返回的数据如下(截取部分):

{
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "demo",
                "_type": "_doc",
                "_id": "1001",
                "_score": 1.0,
                "_source": {
                    "name": "wang",
                    "sex": "man",
                    "phone": "123456"
                }
            }
        ]
    }
}
  • "total" 中的值表示本地查询条件的结果总数情况:总共3条,查询关系为等值查询;
  • 最里面的 "hits" 表示返回的具体值列表,而其中的 "_source" 列出每个文档数据中的所有字段值。

15、指定返回字段


curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体参数:

{
	"query": {
		"match_all": {
		}
	},
	"from": 0,
	"size": 1,
    "_source": ["name"]
}
  • 指定返回字段的参数为 _source,值为要返回的字段列表。

这里,我们只指定了返回 name 字段,结果如下:

{
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "demo",
                "_type": "_doc",
                "_id": "1001",
                "_score": 1.0,
                "_source": {  // 结果只返回了name字段
                    "name": "wang"  
                }
            },
        ]
    }
}

16、查询结果排序


curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体参数如下:

{
	"query": {
		"match_all": {
		}
	},
    "sort": {
    	"phone": {
    		"order": "desc"
    	}
    }
}
  • 排序使用的是 "_sort" 参数,里面填写要按哪个字段排序,排序字段中填写排序的顺序:desc 表降序,asc 表示升序;
  • 这里参数的意思是:按照 phone 字段排序,排序规则为 desc 降序。

17、多条件查询和范围查询


1、多条件查询

curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体参数如下:

{
	"query": {
		"bool": {
			"must": [
				{
					"match": {
						"name": "wang"
					}
				},
				{
					"match": {
						"age": 10
					}
				}
			]
		}
	}
}
  • query 参数表示查询,bool 参数表示查询的条件,里面填写要查询的条件;
  • must 参数表示多个条件要同时成立,里面填写条件列表,相当于 AND 的意思;
  • 整个请求参数表示:匹配 namewang 并且 age 为 10 的文档数据。

如果要表示或的话,需要将 msut 改成 should

{
	"query": {
		"bool": {
			"should": [
				{
					"match": {
						"name": "wang"
					}
				},
				{
					"match": {
						"name": "andy"
					}
				}
			]
		}
	}
}
  • 这里的 should 参数表示条件列表中任意一个匹配即可,相当于 OR 的意思;
  • 这里的请求参数表示:匹配 namewang 或者 nameandy 的文档数据。

2、范围查询

范围查询的请求参数如下:

{
	"query": {
		"bool": {
			"must": [
				{
					"match": {
						"name": "wang"
					}
				}
			],
			"filter": {
				"range": {
					"age": {
						"gt": 10
					}
				}
			}
		}
	}
}
  • 范围查询只需要在 bool 条件下添加 filter 参数,改参数里面可以填写多个过滤条件;
  • filter 参数下的 range 条件调试范围,里面填写要范围查询的字段;
  • 这里的请求参数表示:匹配所有 namewang 的文档数据,同时对这些数据进行过滤,过滤条件为 age 字段值必须大于 10,gt 表示大于,常见的还有 lt(小于)、eq(等于)、ne(不等于)等等。

18、全文检索


ES 的全文检索:

curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体数据:

{
	"query": {
		"match": {
			"name": "你好"
		}
	}
}

得到的结果会是 name 字段中包含 你好 的所有文档数据。

主要原因是:

  • 当我们保存文档数据时,ES 会对数据文字进行分词、拆解操作,并将拆解后的数据保存到倒排索引当中,这样,即使使用文字的一部分也可以查询到数据。这种方式也称之为全文检索方式
  • 当查询的时候,ES 会对查询内容进行分词,然后在倒排索引中进行匹配;
  • 分词的拆解在于的划分,一个单词为一个词,每个汉字可以为一个词。

19、完全匹配


当我们不想对内容进行完全匹配,即不想使用全文检索的分词匹配时需要将 "match" 参数改为 "match_phrase" 参数:

curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体数据:

{
	"query": {
		"match_phrase": {
			"name": "你好"
		}
	}
}
  • "match_phrase" 参数表示对内容进行完全匹配,不进行分词匹配。

20、高亮显示结果


curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体数据:

{
	"query": {
		"match": {
			"name": "你好"
		}
	},
	"highlight": {
		"fields": {
			"name": {}
		}
	}
}

结果如下:

{
    "hits": [
        {
            "_index": "demo",
            "_type": "_doc",
            "_id": "1004",
            "_score": 2.55236,
            "_source": {
                "name": "你好",
                "sex": "woman",
                "age": 555
            },
            "highlight": {
                "name": [
                    ""
                ]
            }
        }
    ]
}
  • 高亮显示使用的是 "highlight" 参数,里面填写要高亮的字段;
  • 这里的意思是:对查询结果进行高亮显示,高亮的字段为 name 字段值;
  • 从查询结果来看,所谓的高亮就是对结果进行样式设定,比如这里的

21、聚合查询


curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体数据:

{
	"aggs": {  // 聚合操作
		"age_group": {  // 统计结果名称,随意起名
			"terms": {  // 分组
				"field": "age"  // 分组字段
			}
		}
	}
}
  • 聚合查询相当于统计分组,使用的是 aggs 参数,不再是 query 参数了;
  • aggs 参数中填写统计结果的名称,可以随意起;
  • terms 参数表示对结果进行分组,里面填写要分组的字段,这里表示对 age 字段进行分组统计。

结果如下(展示部分内容):

{
    "aggregations": {
        "age_group": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": 666,
                    "doc_count": 2
                },
                {
                    "key": 111,
                    "doc_count": 1
                }
            ]
        }
    }
}
  • 结果表示:age 字段值为 666 的文档数量(doc_count)一共有 2 个,值为 111 的有 1 个。

查询的结果其实还包含了具体的数据,如果我们只想返回统计结果而不像要具体数据的话可以添加 size 参数:

{
	"aggs": {  // 聚合操作
		"age_group": {  // 统计结果名称,随意起名
			"terms": {  // 分组
				"field": "age"  // 分组字段
			}
		}
	},
    "size": 0 // 不返回具体数据
}

当然统计还有其它,比如统计平均值:

{
	"aggs": {  // 聚合操作
		"age_avg": {  // 统计结果名称,随意起名
			"avg": {  // 平均值
				"field": "age"  // 分组字段
			}
		}
	},
    "size": 0 // 不返回具体数据
}

结果如下:

{
	"aggregations": {
        "age_avg": {
            "value": 475.7142857142857
        }
    }
}

22、映射关系


在 MySQL 中,一个表,它的字段、类型、长度等信息都属于表的结构信息,在 ES 中也有类似的概念,这些就称之为映射

1)创建映射:

curl -X PUT http://localhost:9200/demo/_mapping -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体参数为:

{
	"properties": {
		"name": {
			"type": "text",
			"index": true
		},
		"sex": {
			"type": "keyword",
			"index": true
		},
		"age": {
			"type": "keyword",
			"index": false
		}
	}
}
  • 创建映射使用的是 PUT 请求,使用 _mapping 命令,这里表示对 demo 索引进行属性映射操作;
  • 属性映射使用 "properties" 参数,里面要填写需要映射的属性字段;
  • 属性字段中的 "type" 参数表示查询类型:text 表示可以分次进行全文本检索、keyword 表示不能分词,必须完整匹配;
  • 属性字段中的 "index" 参数表示是否进行索引,true 表示可以被索引、查询,如果为 false 表示不能被检索、查询;
  • 这里的请求参数意思是:对 demo 索引进行属性映射,其中, name 字段为全文检索,sex 字段为完全匹配,age 字段为不索引。

注意: 当添加数据时,ES 会对数据添加全文本索引属性,所以,如果已经添加了数据,此时再进行映射字段为 keyword 的话就会出错,所以进行映射的时候要注意。

2)查询索引的字段映射:

curl -X GET http://localhost:9200/demo/_mapping/_doc

3)添加映射字段

curl -X PUT http://localhost:9200/demo/_mapping/_doc -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体参数为:

{
	"properties": {
		"address": {
			"type": "text",
			"index": true
		}
	}
}

注意: 字段只能添加,一旦添加无法删除也无法修改。

你可能感兴趣的:(Spring,elasticsearch)