暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Elasticsearch的基本使用

码酱 2020-08-17
681
前期我们已经介绍了Es的安装,本期将介绍Es的基本概念,与spring boot的整合使用。
简介
Elasticsearch是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似。对比关系如下:
索引(indices)--------------------------------Databases 数据库
类型(type)-----------------------------Table 数据表
    文档(Document)----------------Row 行
字段(Field)-------------------Columns 列 
复制

Elasticsearch中支持的数据类型非常丰富:

几个关键常用的:

  • String类型,又分两种:

    • text:可分词,不可参与聚合

    • keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合

  • Numerical:数值类型,分两类

    • 需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。

    • 基本数据类型:long、interger、short、byte、double、float、half_float

    • 浮点数的高精度类型:scaled_float

  • Date:日期类型

    elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。

Elasticsearch集群相关概念:

  • 索引集(Indices,index的复数):逻辑上的完整索引 collection1

  • 分片(shard):数据拆分后的各个部分

  • 副本(replica):每个分片的复制

要注意的是:Elasticsearch本身就是分布式的,因此即便你只有一个节点,Elasticsearch默认也会对你的数据进行分片和副本操作,当你向集群添加新数据时,数据也会在新加入的节点中进行平衡。

Es的增删改查

使用kibana的控制台操作,可以对http请求进行简化
1.创建索引和映射关系
PUT /索引库名/_mapping/类型名称
{
"properties": {
"字段名": {
"type": "类型",
"index": true
"store": true
"analyzer": "分词器"
}
}
}
复制
  • 类型名称:就是前面type的概念,类似于数据库中的不同表字段名:任意填写,可以指定许多属性,例如:

  • type:类型,可以是text、long、short、date、integer、object等

  • index:是否索引,默认为true

  • store:是否存储,默认为false

  • analyzer:分词器,这里的ik_max_word即使用ik分词器

demo:

查看映射关系

GET /索引库名/_mapping
复制
2.新增数据
POST /索引库名/类型名/id值      ##id值可以自己指定,也可以由es自动生成
{
"key":"value"
}
复制
demo:

查看刚刚插入的数据:
get _search
{
"query":{
"match_all":{}
}
}
复制
3.修改数据
    把刚才新增的请求方式改为PUT,就是修改了。不过修改必须指定id
  • id对应文档存在,则修改

  • id对应文档不存在,则新增

PUT /majiang/user/1
{
"name":"diku",
"age":19,
"images":"http://image.majiang.com/diku.jpg"
}
复制
4.删除数据
DELETE /索引库名/类型名/id
复制

5.查询数据

    5.1查询所有

GET /majiang/_search
{
    "query":{  //查询对象
        "match_all": {}   //代表查询所有
}
}
复制

    5.2匹配查询

GET /majiang/_search
{
"query":{
"match":{
"age":19
}
}
}
复制

        结果:

  • 更多相关高级的操作体验请上官方开发文档https://www.elastic.co/guide/index.html

Springboot的整合

1.添加pom依赖

 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
 </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
复制

2.配置application.yml文件

server:
port: 8080
spring:
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 192.168.9.120:9300
复制

3.创建启动器

@SpringBootApplication
public class EsApp {
public static void main(String[] args) {
SpringApplication.run(EsApp.class,args);
}
}
复制

4.创建实体类User

@Data
@Document(indexName = "majiang" ,type="user")
public class User {
private String id;
private String name;
private int age;
    private String images;
public User() {
    }
public User(String id, String name, int age, String images) {
this.id = id;
this.name = name;
this.age = age;
this.images = images;
}
}
复制

5.创建EsRepository

@Repository
public interface EsRepository extends ElasticsearchRepository<User,String> {
}
复制
为了简化操作就没有创建controller、serviceImpl等,通过@SpringBootTest进行演示操作。

6.UserService具体操作

通过ElasticsearchTemplate 和ElasticsearchRepository 来操作。

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserService {
    private static final Logger log = LoggerFactory.getLogger(UserService.class);
@Autowired
    private ElasticsearchTemplate elasticsearchTemplate;
@Autowired
    private EsRepository esRepository;
/**
* 查询所有
*/
@Test
public void getAll() {
esRepository.findAll().forEach(a -> {
log.info(String.valueOf(a));
});


//使用elasticsearchTemplate 构造NativeSearchQueryBuilder对象
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(null).build();
List<User> users = elasticsearchTemplate.queryForList(searchQuery, User.class);
users.forEach(user -> {
log.info(user.toString());
}
);
    }
/**
* 通过id查询
*/
@Test
public void findById() {
log.info(String.valueOf(esRepository.findById("1")));
    }
/**
* 新增
*/
@Test
public void insUser() {
esRepository.save(new User("6", "cccc", 26, "http://image.majiang.com/cccc.jpg"));


//使用elasticsearchTemplate 构造IndexQuery对象
User cccc = new User("8", "oooo", 29, "http://image.majiang.com/oooo.jpg");
IndexQuery indexQuery = new IndexQueryBuilder().withObject(cccc).build();
elasticsearchTemplate.index(indexQuery);
    }
/**
* 修改
*/
@Test
public void updUser() {
esRepository.save(new User("6", "cccc", 29, "http://image.majiang.com/cccc.jpg"));
    }
/**
* 删除
*/
@Test
public void delUser() {
esRepository.deleteById("6");
}
}
复制

查询所有getAll()的执行结果

总结

本篇简单介绍了Elasticsearch的基本操作,Spring boot整合Es的两种方式ElasticsearchTemplate,ElasticsearchRepository。

文章转载自码酱,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论