Elasticsearch(ES) 创建索引库 映射|新增 查询数据

一、创建映射字段的语法格式

需要先构建索引库,在构建索引库中的映射关系

PUT /索引库名/_mapping
{
  "properties": {
    "字段名": {
      "type": "类型",
      "index": true,
      "store": false,
      "analyzer": "分词器"
    }
  }
}
  • 类型名称:映射的名称,字段名:任意填写。Elasticsearch7.0之后不支持类名名称写法所以需要添加include_type_name=true参数进行支持设置。

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

  • index:是否可以使用索引查询,默认为true

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

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

二、了解数据类型

1、字符串

text: 可分词 不可聚合

keyword:不可分词 可聚合

2、数值

整数和浮点(float、double、half_float、scaled_float)

3、日期

date

三、使用springboot创建es项目

1、jar包

spring-boot-starter-data-elasticsearch

2、配置文件(使用自己虚拟机的ip地址)

spring:
  elasticsearch:
    uris: http://ip地址:9200 

3、使用esTemplate模版工具类

@RestController
@RequestMapping("/es")
public class EsController {
    @Autowired
    private ElasticsearchRestTemplate restTemplate;

四、Es实现的功能

1、创建索引库

restTemplate.indexOps(User.class).create();

/*
@Document(indexName = "索引库名",shards = 分片数,replicas = 副本数)
 */
@Document(indexName = "user",shards = 1,replicas = 0)
public class User {
}
​
package com.hl.es.web;
​
import com.hl.es.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
​
@RestController
@RequestMapping("/es")
public class EsController {
    @Autowired
    private ElasticsearchRestTemplate restTemplate;
​
    @RequestMapping("/test")
    public void getEsTemplate(){
        boolean flag = restTemplate.indexOps(User.class).exists();
        System.out.println("索引库是否存在:"+flag);
        if(!flag){
            //创建索引库
            boolean flag2 = restTemplate.indexOps(User.class).create();
            System.out.println("索引库创建结果:"+flag2);
        }
    }
}

运行http://localhost:8080/es/test  创建索引库 查看控制台输出结果,或者在kibana中查找是否创建成功user索引库

2、创建映射

@Document(indexName = "user",shards = 1,replicas = 0)
@Data
public class User {
    @Id
    private Integer id;
    @Field(type = FieldType.Text,analyzer = "ik_max_word")
    private String username;
    @Field(type = FieldType.Text,analyzer = "ik_max_word")
    private String desc;
    @Field(type = FieldType.Keyword,index = false)
    private String password;
    @Field(type = FieldType.Text,analyzer = "ik_max_word")
    private String address;
    @Field(type = FieldType.Double)
    private Double money;
    @Field(type = FieldType.Date,format = DateFormat.custom,pattern = "YYYY-MM-dd")
    private Date createTime;
}
@RequestMapping("/createMapping")
public Object createMapping(){
    Document document = restTemplate.indexOps(User.class).createMapping();
    boolean flag = restTemplate.indexOps(User.class).putMapping(document);
    System.out.println("创建映射:"+flag);
    return flag;
}

3、新增数据

可以多添加几个方编后续测试

@RequestMapping("/save")
public Object save(User user){
    User user2 = restTemplate.save(user);
    return user2;
}

4、查询数据

自定义查询
package com.hl.es.dao;
​
import com.hl.es.pojo.User;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
​
import java.util.List;
​
public interface UserDao
        extends ElasticsearchRepository<User, Integer> {
    //根据用户名查询集合
    //单字段
    public List<User> findByUsername(String username);
    public List<User> findByAddress(String address);
    //多字段
    public List<User> findByDescAndAddress(String desc, String address);
    public List<User> findByDescOrAddress(String desc, String address);
    //范围查询
    public List<User> findAllByIdGreaterThanEqual(Integer minId);
    public List<User> findByMoneyBetween(Double minPrice, Double maxPrice);
    //先根据范围查询,再降序排序
    public List<User> findByMoneyBetweenOrderByMoneyDesc(Double minPrice, Double maxPrice);
​
}
package com.hl.es.web;

import com.hl.es.dao.UserDao;
import com.hl.es.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.document.Document;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/es")
public class ESController {
    @Autowired
    private ElasticsearchRestTemplate restTemplate;
    @Autowired
    private UserDao userDao;

    @RequestMapping("/test")
    public void getEstemplate(){
        boolean flag = restTemplate.indexOps(User.class).exists();
        System.out.println("索引库是否存在:" + flag);
        if(!flag){
            //创建索引库
            boolean flag2 = restTemplate.indexOps(User.class).create();
            System.out.println("索引库创建结果:" + flag2);
        }

    }

    @RequestMapping("/creatMapping")
    public Object createMapping() {
        Document document = restTemplate.indexOps(User.class).createMapping();
        boolean flag  = restTemplate.indexOps(User.class).putMapping(document);
        System.out.println("创建映射:" + flag);
        return flag;
    }

    @RequestMapping("/save")
    public Object save(User user) {
        User user2  = restTemplate.save(user);
        return "操作成功!" + user2;
    }
    @RequestMapping("/operate")
    public Object operate(){
        Iterable it  = userDao.findAll();
        Optional optional = userDao.findById(1);
        User user = (User) optional.get();

        List<Integer> ids = new ArrayList<>();
        ids.add(1);
        ids.add(2);
        Iterable it2 = userDao.findAllById(ids);
        return it;
    }

    @RequestMapping("/query")
    public Object query(String username) {
        return userDao.findByUsername(username);
    }

    @RequestMapping("/query2")
    public Object query2(String address) {
        return userDao.findByAddress(address);
    }

    @RequestMapping("/query3")
    public Object query3(String desc,String address) {
        return userDao.findByDescAndAddress(desc,address);
    }
    @RequestMapping("/query4")
    public Object query4(String desc,String address) {
        return userDao.findByDescOrAddress(desc,address);
    }

    @RequestMapping("/query5")
    public Object query5(Integer id) {
        return userDao.findByIdGreaterThanEqual(id);
    }

    @RequestMapping("/query6")
    public Object query6(Double min, Double max) {
        return userDao.findByMoneyBetween(min,max);
    }

    @RequestMapping("/query7")
    public Object query7(Double min, Double max) {
        return userDao.findByMoneyBetweenOrderByMoneyDesc(min,max);
    }
}

通过不同链接方式查询是否查找成功,例如:

高级查询

1、分页查询

2、聚合查询

3、高亮查询

//高亮处理
@Highlight(
        fields = {@HighlightField(name = "desc"),
                @HighlightField(name = "address"),
                  @HighlightField(name = "username")},
        parameters = @HighlightParameters(preTags = {"<span style='color:red'>"},postTags = {"</span>"})
)
public List<SearchHit<User>> findByDescOrAddressOrUsername(String desc, String address, String username);

五、es专业名词

节点

分片

副本

索引

六、mysq+es的数据同步

当前项目

主数据库: mysql 事务机制

辅助数据库:redis (小数据量的频繁访问 内存 首页商品分类 推荐商品)

es(大量数据的检索 模糊查询 | 数据来自于多个字段 百度搜索 商城的搜索)

mysql:商品表

redis:查询mysql中的数据,新增到redis

mysql------------------》es

方法(saveToMysql -->mq--> saveToEs )(updateToMysql -->mq--->updateToEs ) (deleteToMysql deleteToEs)

项目上线:首次同步,批量同步

项目运行:增量同步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值