入门

倒排索引

正序排列是 id +content

倒序排列就是 content + id

使用http操作ES

索引操作

put 请求 创建索引:http://127.0.0.1:9200/test test是索引名 get 请求 获取索引:http://127.0.0.1:9200/test get 请求 获取所有索引 :http://127.0.0.1:9200/_cat/indices?v
get请求 获取所有索引: http://127.0.0.1:9200/_all delete 请求 删除索引: http://127.0.0.1:9200/test post 请求 关闭索引: http://127.0.0.1:9200/test/_close post请求 打开索引:http://127.0.0.1:9200/test/_open

操作映射

数据类型

1、简单数据类型

  1. # 字符串
  2. text # 可以分词,不能聚合
  3. keyword # 不会分词,可以聚合
  4. # 数字
  5. byte
  6. short
  7. integer
  8. long
  9. float
  10. half_float
  11. scaled_float
  12. double
  13. # 二进制
  14. binary
  15. # 布尔
  16. boolean
  17. # 范围
  18. integer_range
  19. long_range
  20. float_range
  21. double_range
  22. date_range

2、复杂的数据类型

  1. # 数组 []
  2. # 对象
  3. e.g:
  4. {
  5. "mappings": {
  6. "properties": {
  7. "name": {"type": "text"},
  8. "age": {"type":"integer"},
  9. "sex": {"type": "keyword"},
  10. "address":{
  11. "properties": {
  12. "name":{"type":"text"}
  13. }
  14. }
  15. }
  16. }
  17. }

映射操作

//1.创建索引 put key_index //2.创建映射 put key_index/_mapping { "properties" : { "name" : { //字段名称 "type" : "text", //字段类型 "index" : true //是否作为索引 }, "sex" : { "type" : "keyword", "index" : " true" }, "tel" : { "type" : "keyword", "index" : "false" } } } //3.查询映射 get key_index/_mapping //4.创建索引并添加映射 PUT /key_index { "mappings": { "properties": { "name": {"type": "text"}, "age": {"type":"integer"}, "sex": {"type": "keyword"}, "address":{ "properties": { "name":{"type":"text"} } } } } } //5.修改索引,添加新字段 PUT /key_index { "properties": { "name": {"type": "text"}, "age": {"type":"integer"}, "sex": {"type": "keyword"}, "address":{ "properties": { "name":{"type":"text"} } } } }

文档操作

  1. # 添加文档 指定id
  2. PUT /user/_doc/1
  3. {
  4. "name": "张三",
  5. "age": 20,
  6. "sex": "男",
  7. "address": {
  8. "name":"北京市海淀区"
  9. }
  10. }
  11. # 添加文档 不指定id
  12. POST /user/_doc
  13. {
  14. "name": "李四",
  15. "age": 30,
  16. "sex": "男",
  17. "address": {
  18. "name":"北京市朝阳区"
  19. }
  20. }
  21. # 查询文档
  22. GET /user/_doc/1
  23. # 查询所有文档
  24. GET /user/_search
  25. # 删除文档
  26. DELETE /user/_doc/AAOGUIEBbH_Qq13_jJFD
  27. # 修改文档 全量更新
  28. PUT /user/_doc/1
  29. {
  30. "name": "张三",
  31. "age": 20,
  32. "sex": "男",
  33. "address": {
  34. "name":"北京市海淀区"
  35. }
  36. }
  37. # 修改文档 局部更新
  38. POST /user/_update/1
  39. {
  40. "doc": {
  41. "name": "王五"
  42. }
  43. }

修改数据

1、使用put全量修改(新数据覆盖所有旧数据)
http://127.0.0.1:9200/test/_doc/1001 ,路径是·资源对应的url,我们需要将新数据设置在请求体中

  1. # 全量修改,必须设置所有参数,否则会造成属性丢失
  2. 例如原本数据为
  3. {
  4. "title": "小埋",
  5. "size": "big",
  6. "age": "18"
  7. },使用全量修改必须设置请求体为
  8. {
  9. "title": "小埋",
  10. "size": "big",
  11. "age": "19"
  12. }
  13. 如果缺少属性,如
  14. {
  15. "title": "小埋",
  16. "age": "18"
  17. },那么下次查询该数据时,会丢失size属性
  18. 结果为
  19. {
  20. "_index": "test",
  21. "_type": "_doc",
  22. "_id": "1001",
  23. "_version": 5,
  24. "_seq_no": 4,
  25. "_primary_term": 1,
  26. "found": true,
  27. "_source": {
  28. "title": "小埋",
  29. "age": "19"
  30. }
  31. }

2、使用post局部更新
http://127.0.0.1:9200/test/_update/1001 ,需要指定为_update,在请求体重设置要更新的属性

  1. // 局部修改,只需要设置需要更新的属性即可
  2. 例如原本数据为
  3. {
  4. "title": "小埋",
  5. "size": "big",
  6. "age": "18"
  7. },我们要修改sizemorebig,使用局部修改设置请求体为
  8. {
  9. "doc": {
  10. "size" :"morebig"
  11. }
  12. }

查询进阶
  1. #match_all查询
  2. GET test/_search
  3. {
  4. "query": {
  5. "match_all": {}
  6. }
  7. }
  8. #match查询
  9. GET test/_search
  10. {
  11. "query": {
  12. "match": {
  13. "name": {
  14. "query": "可",
  15. "operator": "or"
  16. }
  17. }
  18. }
  19. }
  20. # term查询
  21. GET test/_search
  22. {
  23. "query": {
  24. "term": {
  25. "sex": {
  26. "value": "女"
  27. }
  28. }
  29. }
  30. }
  31. #模糊查询
  32. #模糊分词查询
  33. GET test/_search
  34. {
  35. "query": {
  36. "wildcard": {
  37. "name": {
  38. "value": "可*"
  39. }
  40. }
  41. }
  42. }
  43. #模糊正则查询
  44. GET test/_search
  45. {
  46. "query": {
  47. "regexp": {
  48. "name": "张*"
  49. }
  50. }
  51. }
  52. #模糊前缀查询
  53. GET test/_search
  54. {
  55. "query": {
  56. "prefix": {
  57. "name": {
  58. "value": "可"
  59. }
  60. }
  61. }
  62. }
  63. #范围查询
  64. GET test/_search
  65. {
  66. "query": {
  67. "range": {
  68. "age": {
  69. "gte": 18,
  70. "lte": 20
  71. }
  72. }
  73. }
  74. }
  75. # 排序 sort字段
  76. GET test/_search
  77. {
  78. "query": {
  79. "range": {
  80. "age": {
  81. "gte": 0,
  82. "lte": 30
  83. }
  84. }
  85. },
  86. "sort": [
  87. {
  88. "age": {
  89. "order": "desc"
  90. }
  91. }
  92. ]
  93. }
  94. #分页 from 和 size
  95. GET test/_search
  96. {
  97. "query": {
  98. "range": {
  99. "age": {
  100. "gte": 0,
  101. "lte": 30
  102. }
  103. }
  104. },
  105. "sort": [
  106. {
  107. "age": {
  108. "order": "desc"
  109. }
  110. }
  111. ],
  112. "from": 0,
  113. "size": 20
  114. }

条件查询
我们先准备三条数据
image.png
我们知道,_search会查询索引下所有数据,那么我们添加条件,即可根据条件查询
http://127.0.0.1:9200/test/_search?q=size:big ,匹配test中所有 size 是big的数据
image.png
但是,将条件写在url中,会有一些弊端,譬如中文乱码,所以我们使用另一种方式写条件,将条件写在请求体中

  1. // 指定类型为 query ,指定匹配条件 match,这样效果同写在url
  2. {
  3. "query" : {
  4. "match" : {
  5. "size" : "big"
  6. }
  7. }
  8. }
  9. // 多个条件同时成立 must
  10. {
  11. "query" : {
  12. "bool" : {
  13. "must": [
  14. {
  15. "match" : {
  16. "size" : "big"
  17. }
  18. },
  19. {
  20. "match" : {
  21. "age" : "18"
  22. }
  23. }
  24. ]
  25. }
  26. }
  27. } // 匹配 sizebigage18的数据
  28. // 多个条件任意成立即可 should
  29. {
  30. "query" : {
  31. "bool" : {
  32. "should": [
  33. {
  34. "match" : {
  35. "size" : "big"
  36. }
  37. },
  38. {
  39. "match" : {
  40. "age" : "17"
  41. }
  42. }
  43. ]
  44. }
  45. }
  46. }
  47. // 范围查询 filter
  48. // 扩展 :大于 gt 小于 lt 等于 eq 小于等于 le 大于等于 ge 不等于 ne
  49. {
  50. "query" : {
  51. "bool" : {
  52. "should": [
  53. {
  54. "match" : {
  55. "size" : "big"
  56. }
  57. },
  58. {
  59. "match" : {
  60. "age" : "17"
  61. }
  62. }
  63. ],
  64. "filter" : {
  65. "range" : {
  66. "price" :{ # 该属性范围值必须是数字
  67. "gt" : 5000
  68. }
  69. }
  70. }
  71. }
  72. }
  73. }

分页查询和查询排序

  1. // 使用match_all,表示匹配所有,即查询当前索引下全部,但是弊端是一次性查询的数据过多,可以设置分页
  2. {
  3. "query" : {
  4. "match_all" : {
  5. }
  6. }
  7. }
  8. // 分页查询和排序
  9. {
  10. "query" : {
  11. "match_all" : {
  12. }
  13. },
  14. "from" : 0, // 第几页
  15. "size" : 2, // 分页大小
  16. "_source" : ["name"], // 查询结果只看哪个字段,数组可以设置多个
  17. "sort" : { // 排序
  18. "name.keyword" : "desc" // 字段是数字,写字段名即可,如果是字符,则需要在名字后面加.keyword
  19. }
  20. }
  21. // 扩展 asc 升序 desc 降序

检索

  1. // 全文检索,使用match会检索所有含有条件字符的数据,如下就会匹配size含有b字符和m字符的数据
  2. {
  3. "query" : {
  4. "match" : {
  5. "size" : "bm"
  6. }
  7. }
  8. }
  9. // 完全匹配 match_phrase,严格匹配含有bm的数据
  10. {
  11. "query" : {
  12. "match" : {
  13. "size" : "bm"
  14. }
  15. }
  16. }

聚合操作

  1. {
  2. "aggs" : {
  3. "group_name" : { //分组名称,随便起
  4. "trems" : { //分组标签
  5. "field" : "size" //分组字段
  6. }
  7. }
  8. }
  9. "size" : 0 //不含有原始数据
  10. }

平均操作

  1. {
  2. "aggs" : {
  3. "avg_name" : { //分组名称,随便起
  4. "avg" : { //分组标签
  5. "field" : "size" //分组字段
  6. }
  7. }
  8. }
  9. "size" : 0 //不含有原始数据
  10. }

Java API 7 Java High Level REST Client

索引操作

  1. @Autowired
  2. private RestHighLevelClient client;
  3. @Test
  4. void creatIndex(){
  5. IndicesClient indices = client.indices();
  6. CreateIndexRequest indexRequest = new CreateIndexRequest("test");
  7. String map = "{\n" +
  8. " \"properties\": {\n" +
  9. " \"name\": {\"type\": \"text\"},\n" +
  10. " \"age\": {\"type\":\"integer\"},\n" +
  11. " \"sex\": {\"type\": \"keyword\"}\n" +
  12. " }\n" +
  13. " }";
  14. indexRequest.mapping(map, XContentType.JSON);
  15. try {
  16. CreateIndexResponse response = indices.create(indexRequest, RequestOptions.DEFAULT);
  17. System.out.println(response.isAcknowledged());
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. @Test
  23. void getIndex(){
  24. IndicesClient indices = client.indices();
  25. GetIndexRequest getIndexRequest = new GetIndexRequest("test");
  26. try {
  27. GetIndexResponse getIndexResponse = indices.get(getIndexRequest, RequestOptions.DEFAULT);
  28. System.out.println(getIndexResponse.getMappings().get("test").sourceAsMap());
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. @Test
  34. void deleteIndex(){
  35. IndicesClient indices = client.indices();
  36. DeleteIndexRequest test = new DeleteIndexRequest("test");
  37. try {
  38. System.out.println(indices.delete(test, RequestOptions.DEFAULT).isAcknowledged());
  39. } catch (IOException e) {
  40. e.printStackTrace();
  41. }
  42. }

文档操作

  1. @Test
  2. void putDoc(){
  3. ESUser esUser = new ESUser();
  4. esUser.setName("张三");
  5. esUser.setSex("男");
  6. esUser.setAge(20);
  7. String data = JSONUtil.toJsonStr(esUser);
  8. IndexRequest indexRequest = new IndexRequest("test").id("1").source(data,XContentType.JSON);
  9. try {
  10. IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT);
  11. System.out.println(response.getId());
  12. } catch (IOException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. @Test
  17. void getDoc(){
  18. GetRequest getRequest = new GetRequest("test","1");
  19. try {
  20. GetResponse response = client.get(getRequest, RequestOptions.DEFAULT);
  21. System.out.println(response.getSourceAsString());
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. @Test
  27. void deleteDoc(){
  28. DeleteRequest deleteRequest = new DeleteRequest("test","1");
  29. try {
  30. DeleteResponse delete = client.delete(deleteRequest, RequestOptions.DEFAULT);
  31. System.out.println(delete.getId());
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. }

文档查询

es8.0+新版客户端API使用

一、配置新客户端对象

二、索引操作

image.png