索引(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的增删改查
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
复制
POST /索引库名/类型名/id值 ##id值可以自己指定,也可以由es自动生成
{
"key":"value"
}
复制
get _search
{
"query":{
"match_all":{}
}
}
复制
id对应文档存在,则修改
id对应文档不存在,则新增
PUT /majiang/user/1
{
"name":"diku",
"age":19,
"images":"http://image.majiang.com/diku.jpg"
}
复制
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> {
}
复制
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。