目录
- 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
- 域名地址后面紧跟的
_cat
是 ES 的请求命令,表示查看文档; -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
}
- 返回的
_id
为 ES 随机生成的 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"
表示匹配,里面填写要匹配的字段值;- 这里的请求数据表示:查询 name 为 wang 的所有文档数据。
如果要查询所有数据,请求体可以改成如下:
{
"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
的意思;- 整个请求参数表示:匹配 name 为 wang 并且 age 为 10 的文档数据。
如果要表示或的话,需要将 msut
改成 should
:
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "wang"
}
},
{
"match": {
"name": "andy"
}
}
]
}
}
}
- 这里的
should
参数表示条件列表中任意一个匹配即可,相当于OR
的意思; - 这里的请求参数表示:匹配 name 为 wang 或者 name 为 andy 的文档数据。
2、范围查询
范围查询的请求参数如下:
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "wang"
}
}
],
"filter": {
"range": {
"age": {
"gt": 10
}
}
}
}
}
}
- 范围查询只需要在
bool
条件下添加filter
参数,改参数里面可以填写多个过滤条件; filter
参数下的range
条件调试范围,里面填写要范围查询的字段;- 这里的请求参数表示:匹配所有 name 为 wang 的文档数据,同时对这些数据进行过滤,过滤条件为 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": [
"<em>你</em><em>好</em>"
]
}
}
]
}
- 高亮显示使用的是
"highlight"
参数,里面填写要高亮的字段; - 这里的意思是:对查询结果进行高亮显示,高亮的字段为 name 字段值;
- 从查询结果来看,所谓的高亮就是对结果进行样式设定,比如这里的
<em></em>
。
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
}
}
}
注意: 字段只能添加,一旦添加无法删除也无法修改。