curl -X GET http://localhost:9200
curl -X PUT http://localhost:9200/demo
PUT
请求,域名地址后面的 demo
就是要添加的索引名称;PUT
请求操作结果是幂等性的,意思是多次相同的请求结果是一样的,所以,再次执行该请求时会报错提示索引已存在了。curl -X GET http://localhost:9200/demo
GET
请求,域名地址后面的 demo
就是所要访问的索引名称。curl -X GET http://localhost:9200/_cat/indices?v
_cat
是 ES 的请求命令,表示查看文档;-v
参数表示把所有信息详细地展示出来。curl -X DELETE http://localhost:9200/demo
DELETE
请求,域名地址后面紧跟要删除的索引名称。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
}
_id
为 ES 随机生成的 ID。curl -X POST http://localhost:9200/demo/_doc/1001 -d "{\"name\": \"hello\"}" -H "content-type: application/json; charset=UTF-8"
返回内容如下:
{
"_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 值;curl -X GET http://localhost:9200/demo/_doc/1001
curl -X GET http://localhost:9200/demo/_search
_search
命令获取所有文档数据。curl -X PUT http://localhost:9200/demo/_doc/1001 -d "{\"name\": \"java\"}" -H "content-type: application/json; charset=UTF-8"
PUT
请求发送 _doc
命令修改 ID 值为 1001 的文档数据;返回结果会提示我们该请求为更新 update 操作:
{
"_index": "demo",
"_type": "_doc",
"_id": "1001",
"_version": 3,
"result": "updated",
}
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
命令会被认为是创建文档数据;{"doc": {key: value}}
,在 doc 中指定要修改的字段即可。curl -X DELETE http://localhost:9200/demo/_doc/1001
_doc
命令、DELETE
请求。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"
表示匹配,里面填写要匹配的字段值;如果要查询所有数据,请求体可以改成如下:
{
"query": {
"match_all": {
}
}
}
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"
列出每个文档数据中的所有字段值。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"
}
},
]
}
}
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
表示升序;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
的意思;如果要表示或的话,需要将 msut
改成 should
:
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "wang"
}
},
{
"match": {
"name": "andy"
}
}
]
}
}
}
should
参数表示条件列表中任意一个匹配即可,相当于 OR
的意思;2、范围查询
范围查询的请求参数如下:
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "wang"
}
}
],
"filter": {
"range": {
"age": {
"gt": 10
}
}
}
}
}
}
bool
条件下添加 filter
参数,改参数里面可以填写多个过滤条件;filter
参数下的 range
条件调试范围,里面填写要范围查询的字段;gt
表示大于,常见的还有 lt
(小于)、eq
(等于)、ne(不等于)
等等。ES 的全文检索:
curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"
请求体数据:
{
"query": {
"match": {
"name": "你好"
}
}
}
得到的结果会是 name 字段中包含 你、好、你好 的所有文档数据。
主要原因是:
当我们不想对内容进行完全匹配,即不想使用全文检索的分词匹配时需要将 "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"
参数表示对内容进行完全匹配,不进行分词匹配。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"
参数,里面填写要高亮的字段;
。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
}
]
}
}
}
查询的结果其实还包含了具体的数据,如果我们只想返回统计结果而不像要具体数据的话可以添加 size
参数:
{
"aggs": { // 聚合操作
"age_group": { // 统计结果名称,随意起名
"terms": { // 分组
"field": "age" // 分组字段
}
}
},
"size": 0 // 不返回具体数据
}
当然统计还有其它,比如统计平均值:
{
"aggs": { // 聚合操作
"age_avg": { // 统计结果名称,随意起名
"avg": { // 平均值
"field": "age" // 分组字段
}
}
},
"size": 0 // 不返回具体数据
}
结果如下:
{
"aggregations": {
"age_avg": {
"value": 475.7142857142857
}
}
}
在 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 表示不能被检索、查询;注意: 当添加数据时,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
}
}
}
注意: 字段只能添加,一旦添加无法删除也无法修改。