Elasticsearch 手册

本文档详细介绍了Elasticsearch与MySQL的关系,包括Elasticsearch的索引库、类型、文档、字段和映射配置等核心概念。通过HTTP API展示了创建、查询、修改和删除索引及文档的操作,还涵盖了复杂的查询方式如全查询、条件查询、聚合查询以及分词器的使用。此外,还提及了Java客户端的配置和操作方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为工作太忙,没有时间排版,原版本是自己总结的word,有需要请私信我。

基础概念

Elasticsearch对应MySQL的对应关系如下:

Elasticsearch

MySQL

索引库(indices)

Database 数据库

类型(type)

Table 数据表

文档(Document)

Row 行

域字段(Field)

Columns 列

映射配置(mappings)

每个列的约束(类型、长度)

对Elasticsearch相关概念说明:

概念

说明

索引库(indices)

indices是index的复数,代表许多的索引

类型(type)

类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引(目前6.X以后的版本只能有一个类型),类似数据库中的表概念。数据库表中有表结构,也就是表中每个字段的约束信息;索引库的类型中对应表结构的叫做映射(mapping),用来定义每个字段的约束。

文档(document)

存入索引库原始的数据。比如每一条商品信息,就是一个文档

字段(field)

文档中的属性

映射配置(mappings)

字段的数据类型、属性、是否索引、是否存储等特性

一、索引

PUT 代表创建请求有幂等性,多次请求只会有一次成功

  1. 创建索引:

创建名称为shopping的索引。


  1. PUT  Http:127.0.0.1:9200/shopping


2.通过索引名称查看索引的信息:


  1. GET Http:127.0.0.1:9200/shopping


3.查看所有的索引信息:


  1. GET Http:127.0.0.1:9200/_cat/indices?V


  1. 通过索引名称删除索引:


  1. Delete Http:127.0.0.1:9200/shopping


二、文档操作

Mysql增加数据需要表,ES新版本中直接在索引中添加数据

  1. 新增文档:

  1. POST Http:127.0.0.1:9200/shopping/_doc
  2. {
  3. “title”:”添加的第一个文档”,
  4. “msg”:”添加成功”
  5. }

必须要以JSON格式为请求体,没有请求ES会报错。不可以用PUT请求,因为新增文档请求成功后会返回一串消息,消息里面的_id是不同的,也就是说同样的请求都会返回不同的结果。

新增文档时给文档设置我们自己的id,而不是ES自动生成的UUID:


  1. POST Http:127.0.0.1:9200/shopping/_doc/1001
  2. {
  3. “title”:”添加的第一个文档”,
  4. “msg”:”添加成功”
  5. }


创建id为1001的一条JSON文档。因为id是我们确定后自定义的,这时候就可以用PUT请求创建了,幂等性问题解决。


  1. PUT Http:127.0.0.1:9200/shopping/_doc/1001
  2. {
  3. “title”:”添加的第一个文档”,
  4. “msg”:”添加成功”
  5. }


总结: 自定义ID可以用POST或者PUT,ES生成UUID就只能用POST。

  1. 根据id查询文档:


  1. Get Http:127.0.0.1:9200/shopping/_doc/1001


Shopping 代表索引的名称,_doc代表文档,1001是文档的id。查询id为1001的文档

  1. 查询索引下的所有文档:


  1. Get Http:127.0.0.1:9200/shopping/_search


4.修改文档:

分为两种情况,1-完全覆盖,2-部分数据修改(局部更新)

4.1完全覆盖:返回的消息都是一定的所以可以用PUT请求:


  1. PUT Http:127.0.0.1:9200/shopping/_doc/1001
  2. {
  3. “title”:”修改的第一个文档,V_2”,
  4. “msg”:”修改成功V_2”
  5. }


完全覆盖掉id为1001的文档

4.2部分数据修改(局部更新),每次返回的消息都可能不一样,所以用POST请求


  1. PUT Http:127.0.0.1:9200/shopping/_update/1001
  2. {
  3. “doc” :{
  4. “title”:”局部更新第一个文档,V_2”,
  5.  }
  6. }


局部更新id为1001的title名称,而msg不更新。

5删除文档:


  1. DELETE Http:127.0.0.1:9200/shopping/_doc/1001


在shpping索引中删除文档(_doc就是文档的意思)id为1001的文档

三、复杂查询

在索引中通过条件,查询索引内部的符合条件的文档。返回的结果集合中,took值表示查询响应使用了多少毫秒

1.简单条件全查询(match_all)

    1. url路劲条件查询(不推荐)

因为url路径中带有中文,可能会出现乱码所以推荐把请求参数写入到http的Body请求体中。


  1. Get Http:127.0.0.1:9200/shopping/_search?q=title:局部更新第一个文档,V_2


q代表query查询条件的简写。q为key ,”title:局部更新第一个文档,V_2”为value。查询出“title”为“局部更新第一个文档,V_2”的值。

1.2 Body请求体分页查询

因为url路径中带有中文,可能会出现乱码所以推荐把请求参数写入到http的Body请求体中。


  1. Get Http:127.0.0.1:9200/shopping/_search?q=title:局部更新第一个文档,V_2
  2. {
  3. "query" :{
  4. "match_all" :{
  5. }
  6. },
  7. "from": 0,
  8. "size": 2,
  9. "_source": {msg},
  10. "sort" : {
  11. "create_time" : {
  12. "order" : "desc"
  13. }
  14. }
  15. }


Match_all代表全查询(检索出所有文档),form表示起始页,size表示每页大小,_source表示过滤——只检索出文档中的msg字段,sort表示排序,对文档中的create_time字段进行降序排序。

  1.  多条件查询

2.1 条件同时成立must


  1. {
  2. "query" :{
  3. "bool" : {
  4. "must" : [
  5. "match" : {
  6. "msg": "msg字段第一次使用多条件查询"
  7. },
  8.                 "match" : {
  9. "title": "title字段第一次使用多条件查询"
  10. }
  11. ]
  12. }
  13. }
  14. }


query表示查询,多个条件使用bool包裹,must表示必须成立(与sql中的and相似),match表示匹配,在文档中查询msg等于 "msg字段第一次使用多条件查询" 并且条件 msg等于 "title字段第一次使用多条件查询" 的数据记录。

2.2 匹配一个条件(类似sql的or)shold


  1. {
  2. "query" :{
  3. "bool" : {
  4. "should" : [
  5. "match" : {
  6. "msg": "msg字段第一次使用多条件查询"
  7. },
  8.                 "match" : {
  9. "title": "title字段第一次使用多条件查询"
  10. }
  11. ]
  12. }
  13. }
  14. }


should字段类似于sql当中的or查询, 查询出文档内“msg”等于"msg字段第一次使用多条件查询"  或者  "title"等于"title字段第一次使用多条件查询"的字段。

2.3 条件过滤filter


  1. {
  2. "query" :{
  3. "bool" : {
  4. "must" : [
  5. "match" : {
  6. "msg": "第一次使用多条件查询"
  7. },
  8. "match" : {
  9. "title": "title字段第一次使用多条件查询"
  10. }
  11. ],
  12. "filter" : {
  13. "range" : {
  14. "create_time" :2021-5-29
  15. }
  16. }
  17. }
  18. }
  19. }


继续在2.2的基础上增加操作,使用filter过滤出create_time在2021-5-29的范围(range)内的文档。

  1. 完全匹配(match_phrase)

ES底层的索引机制为倒排索引,索引记载了哪些文档包含某个单词,单词为key,key的value值记载的是文档的ids(多个文档的id如:1,2,3,4,5)以及词频率(TF)和地址(POS)。如2.3.3代码块,条件key -"msg" 、value-"第一次使用多条件查询" 在ES中会对value进行分词,可能拆分为“第一次”、“使用”、“多条件”、“查询”,只要msg中包含其中一项就会命中。可是,如果想要他底层不进行分词检索,这时候就要把match改为match_phrase。


  1. {
  2. "query" :{
  3. "match_phrase" :{
  4. "msg": "第一次使用多条件查询"
  5. }
  6. },
  7. }


  1. 高亮显示


  1. {
  2.   "query" :{
  3.   "match_phrase" :{
  4. "msg": "第一次使用高亮查询"
  5. }
  6. },
  7.   "highlight": {
  8.   "fields":[
  9. "msg" : {}
  10.  ]
  11.   }
  12. }


highlight表示高亮,fields表示想要高亮的字段集合,msg是我们想要高亮的字段。

  1. 聚合查询

5.1分组统计


  1. // 返回统计结果
  2. {
  3. "aggs" : { //聚合操作
  4. "year_group" :{  //名称,可以随意取名
  5. "trems" : { //设置分组
  6. "field" : "year"  //想要分组的字段
  7. }
  8. }
  9. },
  10. "size" : 0 //如果加上了就不会展示统计过后的源数据
  11. }


5.2 平均值统计


  1. // 返回统计结果
  2. {
  3. "aggs" : { //聚合操作
  4. "price_avg" :{  //名称,可以随意取名
  5. "avg" : { //设置平均值
  6. "field" : "price"  //想要分组的字段
  7. }
  8. }
  9. },
  10. "size" : 0 //如果加上了就不会展示统计过后的源数据
  11. }


  • 映射

1.概念与type

映射就相当于mysql当中创建的字段,官网上说的Elasticsearch 支持如下简单域类型:

JSON type

域 type

布尔型: true 或者 false

boolean

整数: 123

long

浮点数: 123.45

double

字符串,有效日期: 2014-09-15

date

字符串: foo bar

string

简单类型:

  • 字符串: string
  • 整数 : byteshortintegerlong
  • 浮点数: floatdouble
  • 布尔型: boolean
  • 日期: date
  1. 创建映射(mapping)


  1. PUT Http:127.0.0.1:9200/user/_mapping
  2. {
  3. "properties" : {
  4. "name" : { //字段名称
  5. "type" : "text", // text表示可以分词
  6. "index" : true //这个字段可以索引查询
  7. },
  8. "telephone_number" : {
  9. "type" : "keyword" // keyword表示不可以分词
  10. "index" : false //这个字段在文档中只做存储而不会创建倒排索引
  11. }
  12. }


创建名称为user的索引,并且给他设置字段映射_mapping。

  1. 查看映射


  1. GET Http:127.0.0.1:9200/user/_mapping


查看索引名称为user的映射结构。

  • 分词器

1.自带的几种分词器

分词器

解释

standard

标准标记器,标准过滤器,小写过滤器,停止过滤器

simple

小写的分词器

stop

小写标记器,停止过滤器

keyword

不分词,内容整体作为一个值

whitespace

以空格分词

language

以语言分词

snowball

标准标记器,标准过滤器,小写过滤器,停止过滤器,雪球过滤器

custom

自定义分词。至少需要指定一个 Tokenizer, 零个或多个Token Filter, 零个或多个Char Filter

pattern

正则分词

  • Java 客户端操作

1.基础配置

1.1 maven配置

依赖版本一定要对应ES的版本


  1.       <!--spring-boot-elasticsearch依赖-->
  2.         <dependency>
  3.             <groupId>org.springframework.boot</groupId>
  4.             <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  5.  <version>7.6.1</version>
  6.         </dependency>
  7.         <!--elasticsearch高级api rest-high-level-->
  8.         <dependency>
  9.             <groupId>org.elasticsearch.client</groupId>
  10.             <artifactId>elasticsearch-rest-high-level-client</artifactId>
  11.             <version>7.6.1</version>
  12.         </dependency>


1.2 连接池工具类


  1. import org.apache.http.HttpHost;
  2. import org.apache.http.auth.AuthScope;
  3. import org.apache.http.auth.UsernamePasswordCredentials;
  4. import org.apache.http.client.CredentialsProvider;
  5. import org.apache.http.impl.client.BasicCredentialsProvider;
  6. import org.elasticsearch.client.Node;
  7. import org.elasticsearch.client.RestClient;
  8. import org.elasticsearch.client.RestClientBuilder;
  9. import org.elasticsearch.client.RestHighLevelClient;
  10. import org.springframework.beans.factory.annotation.Value;
  11. import org.springframework.context.annotation.Bean;
  12. import org.springframework.context.annotation.Configuration;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. @Configuration
  16. public class ElasticsearchConfig {
  17.     /** 协议 */
  18.     @Value("${elasticsearch.schema:http}")
  19.     private String schema;
  20.     /** 集群地址,如果有多个用“,”隔开 */
  21.     @Value("${elasticsearch.address}")
  22.     private String address;
  23.     /** 连接超时时间 */
  24.     @Value("${elasticsearch.connectTimeout}")
  25.     private int connectTimeout;
  26.     /** Socket 连接超时时间 */
  27.     @Value("${elasticsearch.socketTimeout}")
  28.     private int socketTimeout;
  29.     /** 获取连接的超时时间 */
  30.     @Value("${elasticsearch.connectionRequestTimeout}")
  31.     private int connectionRequestTimeout;
  32.     /** 最大连接数 */
  33.     @Value("${elasticsearch.maxConnectNum}")
  34.     private int maxConnectNum;
  35.     /** 最大路由连接数 */
  36.     @Value("${elasticsearch.maxConnectPerRoute}")
  37.     private int maxConnectPerRoute;
  38.     /** 用户名 */
  39.     @Value("${elasticsearch.user}")
  40.     private String user;
  41.     /** 用户名 */
  42.     @Value("${elasticsearch.password}")
  43.     private String password;
  44.     @Bean(name = "restHighLevelClient")
  45.     public RestHighLevelClient restHighLevelClient() {
  46.         //设置用户名密码
  47.         CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
  48.         credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(user, password));
  49.         // 拆分地址
  50.         List<HttpHost> hostLists = new ArrayList<>();
  51.         String[] hostList = address.split(",");
  52.         for (String addr : hostList) {
  53.             String host = addr.split(":")[0];
  54.             String port = addr.split(":")[1];
  55.             hostLists.add(new HttpHost(host, Integer.parseInt(port), schema));
  56.         }
  57.         // 转换成 HttpHost 数组
  58.         HttpHost[] httpHost = hostLists.toArray(new HttpHost[]{});
  59.         // 构建连接对象
  60.         RestClientBuilder builder = RestClient.builder(httpHost);
  61.         // 定义监听器,节点出现故障会收到通知。
  62.         builder.setFailureListener(new RestClient.FailureListener() {
  63.             @Override
  64.             public void onFailure(Node node) {
  65.                 super.onFailure(node);
  66.             }
  67.         });
  68.         // 异步请求连接延时配置
  69.         builder.setRequestConfigCallback(requestConfigBuilder -> {
  70.             //连接超时时间
  71.             requestConfigBuilder.setConnectTimeout(connectTimeout);
  72.             //Socket 连接超时时间
  73.             requestConfigBuilder.setSocketTimeout(socketTimeout);
  74.             //获取连接的超时时间
  75.             requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeout);
  76.             return requestConfigBuilder;
  77.         });
  78.         // 异步的httpclient连接数配置
  79.         builder.setHttpClientConfigCallback(httpClientBuilder -> {
  80.             // 最大连接数
  81.             httpClientBuilder.setMaxConnTotal(maxConnectNum);
  82.             // 最大路由连接数
  83.             httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
  84.             // 赋予连接凭证
  85.             httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
  86.             return httpClientBuilder;
  87.         });
  88.         return new RestHighLevelClient(builder);
  89.     }
  90. }


1.3 application.yml配置

对于集群连接,address采用逗号间隔


  1. elasticsearch:
  2.   schema: http
  3.   address: 127.0.0.1:9200,127.0.0.1:9500,
  4.   connectTimeout: 5000
  5.   socketTimeout: 5000
  6.   connectionRequestTimeout: 5000
  7.   maxConnectNum: 100
  8.   maxConnectPerRoute: 100
  9.   user:
  10.   password:


  1. 创建索引

ES一个索引默认有 5 个主分片,每个主分片默认有 1 个副本分片,即创建一个索引默认会有 10 个分片


  1.         CreateIndexRequest request = new CreateIndexRequest(indexName);
  2.         request.settings(Settings.builder()
  3.                 .put("index.number_of_shards", 5)
  4.                 .put("index.number_of_replicas", 1)
  5.         );
  6. CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request,RequestOptions.DEFAULT);
  7.         return createIndexResponse.isAcknowledged();


第一行代码创建——请求创建索引对象

第二至五行配置索引信息

第三行设置索引的分片数为5

第三行设置索引的副本数为1

第六至七行通过基础配置中的——1.2的工具类,发起索引请求,请求参数为构建好的索引对象、RequestOptions.DEFAULT(默认网络请求配置)

第八行获取执行的结果,true为成功,false为失败

  1. 删除索引


  1.             //Delete请求头
  2.             DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(indexName);
  3.             //客户端执行请求,并接受返回值
  4.             AcknowledgedResponse delete = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值