ElasticSearch使用(2)——增删查改

参考地址:https://blog.csdn.net/Zereao/article/details/89378283

基本格式

1、ElasticSearch是基于Restful API进行的数据库操作,基本格式如下:http://<ip>:<port>/<索引>/<类型>/<文档 id>

2、从ES7.0.0开始,Type就被移除了,所以路径格式变成了: http://<ip>:<port>/<索引>/_doc/<文档ID>

请求工具

1、使用elasticsearch-head插件,在页面提交请求

2、使用Postman等第三方HTTP客户

3、使用的IntelliJ IDEA的 Http Request工具,编写http文件

创建索引

http文件如下:

###  创建一个新的 people 索引,注意,将IP替换为你们自己的主机地址
PUT http://10.247.63.97:9200/people
Content-Type: application/json
 
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "type": {"type": "keyword"},
      "name": {"type": "text"},
      "country": {"type": "keyword"},
      "age": {"type": "integer"},
      "date": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || epoch_millis"
      }
    }
  }
}
  • settings字段:用于指定我们索引的配置
    •  number_of_shards:  指定当前索引的分片数
    •  number_of_replicas: 指定当前索引的备份数
  • mappings字段:指定索引的数据映射定义:
    • properties:指定索引的属性定义;这里,这里,定义了 5 个字段,分别为 type、name、country、age、date;需要注意的是,这里的type,这是一个字段,和我们上文中提到的在7.0中移除了的类型(Type)并不是同一个东西;官方推荐我们的是,如果我们有 类型(Type)定义 这个需求,我们可以在字段中自定义一个字段,用来标识当前 document 属于哪个 Type;这里,我们就使用这个名为 “type” 字段(可以按照自己的习惯自定义名称),来标识当前文档属于哪个 Type;
    • 后面的 {"type" : "integer"}、{"type" : "text"}分别表示当前字段数据的类型为 整数、文本,以及 关键字(keyword)、日期类型等。
    • date字段中,我们可以为其指定匹配多种格式,使用 || 分隔;

数据插入

  • 指定文档ID插入:
###  向 people索引中插入一条  指定ID的数据,注意请求方式为 PUT
# 路径格式为 http://<ip>:<port>/<索引>/_doc/<文档ID>,下面我们插入了一条 ID 为 1 的数据
PUT http://10.247.63.97:9200/people/_doc/1
Content-Type: application/json
 
{
  "type": "man",
  "name": "Zereao",
  "country": "China",
  "age": "23",
  "date": "1995-11-27"
}
  • 自动生成ID插入:
###  向 people索引中插入一条  自动生成ID的数据,注意,请求方式为 POST,并删除URL末尾的 ID
POST http://10.247.63.97:9200/people/_doc/
Content-Type: application/json
 
{
  "type": "man",
  "name": "AutoZereao",
  "country": "China",
  "age": "23",
  "date": "1995-11-27 12:25:35"
}

数据修改

###  修改 ID 为 1 的文档的 name 字段值为 UpdateZereao,格式:{index}/_update/{id}
POST http://10.247.63.97:9200/people/_update/1/
Content-Type: application/json
 
{
  "doc": {
    "name": "UpdateZereao"
  }
}

删除操作

  • 文档删除
###  删除 people索引中 ID = 1 的文档
DELETE http://10.247.63.97:9200/people/_doc/1/
Content-Type: application/json
  • 索引删除:最简单的方式是通过head插件进行删除

查询操作

ES的查询可以分为简单查询、条件查询、聚合查询。

  • 简单查询:
###  简单查询,查询 book 索引中,ID为1 的文档
GET http://10.247.63.97:9200/book/_doc/1
Content-Type: application/json

 

  • 条件查询:
### 条件查询,查询所有数据
POST http://10.247.63.97:9200/book/_search
Content-Type: application/json
 
{
  "query": {
    "match_all": {}
  }
}
### 条件查询,指定返回数据大小以及从哪里开始返回
POST http://10.247.63.97:9200/book/_search
Content-Type: application/json
 
{
  "query": {
    "match_all": {}
  },
  "from": 1,
  "size": 1
}


关键词匹配:

### 条件查询,查询标题中包含 传 字的文档
POST http://10.247.63.97:9200/book/_search
Content-Type: application/json
 
{
  "query": {
    "match": {
      "title": "传"
    }
  }
}


这里,将会查出两条数据。默认情况下,查询出的结果 hits json数组中的数据,是按照_score字段的值大小倒序排序的。我们也可以指定排序方式:

### 条件查询,指定排序方式为 按照 publish_date 降序 排序
POST http://10.247.63.97:9200/book/_search
Content-Type: application/json
 
{
  "query": {
    "match": {
      "title": "传"
    }
  },
  "sort": [
    {
      "publish_date": {
        "order": "desc"
      }
    }
  ]
}


聚合查询:

单个分组聚合:

###   聚合查询,按照 这一批 book 的字数进行聚合;  这是一个单个分组聚合
POST http://10.247.63.97:9200/book/_search
Content-Type: application/json
 
{
  "aggs": {
    "group_by_word_count": {
      "terms": {
        "field": "word_count"
      }
    }
  }
}


注意,上面的 group_by_word_count 表示该聚合的名称,是自定义的,可以自己为该聚合命名。

多个分组聚合:

###   聚合查询,按照 这一批 book 的字数和出版日期进行聚合;  这是一个多个分组聚合
POST http://10.247.63.97:9200/book/_search
Content-Type: application/json
 
{
  "aggs": {
    "group_by_word_count": {
      "terms": {
        "field": "word_count"
      }
    },
    "group_by_publish_date": {
      "terms": {
        "field": "publish_date"
      }
    }
  }
}


计算某一字段的数据:

###   聚合查询,计算 word_count 字段的相关数据
POST http://10.247.63.97:9200/book/_search
Content-Type: application/json
 
{
  "aggs": {
    "grades_word_count": {
      "stats": {
        "field": "word_count"
      }
    }
  }
}


这里,grades_word_count也是可以自定义的,stats表示对字段值进行计算。执行后,我们可以得到一段这样的数据:

如图,上面计算除了 word_count 字段的 最大值、最小值、均值、数量、总和等数据。
 

 

好的,下面是一个简单的示例: 1. 引入依赖 在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> ``` 2. 配置 Elasticsearch 在 application.properties 文件中添加 Elasticsearch 相关配置: ```properties spring.elasticsearch.rest.uris=http://localhost:9200 ``` 3. 定义实体类 创建一个实体类,例如: ```java @Document(indexName = "user") public class User { @Id private String id; private String name; private Integer age; // getter/setter 略 } ``` 4. 创建 Elasticsearch Repository 创建一个继承自 ElasticsearchRepository 的接口,例如: ```java public interface UserRepository extends ElasticsearchRepository<User, String> { } ``` 5. 编写增删查改方法 在业务逻辑层中编写增删查改方法,例如: ```java @Service public class UserService { @Autowired private UserRepository userRepository; public void save(User user) { userRepository.save(user); } public void delete(String id) { userRepository.deleteById(id); } public List<User> search(String keyword) { return userRepository.findByNameContaining(keyword); } public void update(User user) { userRepository.save(user); } } ``` 以上示例中,save 方法用于保存用户信息,delete 方法用于删除用户信息,search 方法用于根据关键字搜索用户信息,update 方法用于更新用户信息。 6. 测试 编写测试类,例如: ```java @RunWith(SpringRunner.class) @SpringBootTest public class UserServiceTest { @Autowired private UserService userService; @Test public void testSave() { User user = new User(); user.setId("1"); user.setName("张三"); user.setAge(20); userService.save(user); } @Test public void testDelete() { userService.delete("1"); } @Test public void testSearch() { List<User> userList = userService.search("张三"); System.out.println(userList); } @Test public void testUpdate() { User user = new User(); user.setId("1"); user.setName("张三"); user.setAge(25); userService.update(user); } } ``` 以上示例中,testSave 方法用于测试保存用户信息,testDelete 方法用于测试删除用户信息,testSearch 方法用于测试根据关键字搜索用户信息,testUpdate 方法用于测试更新用户信息。 运行测试类,查看控制台输出结果,即可验证增删查改功能是否正常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值