Elasticsearch02——语法格式、数据类型、springboot项目创建es、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、配置文件

spring:
  elasticsearch:
   uris: http://1.94.230.82: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);
        }
    }
}

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);
​
}
高级查询

1、分页查询

/**
* 高级查询-分页查询
*/
//高级查询-分页查询
@RequestMapping("/pageQuery")
public List<Goods> matchPageQuery(){
//构建queryBuilder
NativeSearchQueryBuilder searchQueryBuilder = new
NativeSearchQueryBuilder();
//设置基础的查询条件
searchQueryBuilder.withQuery(QueryBuilders.termQuery("category","手
机"));
//设置分页
int page = 0; //查询的当前页 0表示第一页数据
int size = 3; //每页显示条数
searchQueryBuilder.withPageable(PageRequest.of(page,size));
Page<Goods> search =
esRepository.search(searchQueryBuilder.build());
//总条数
System.out.println(search.getTotalElements());
//总页数
System.out.println(search.getTotalPages());
//每页显示条数
System.out.println(search.getSize());
//当前页
System.out.println(search.getNumber());
//获取分页数据
List<Goods> content = search.getContent();
return content;
}

2、聚合查询

/**
* 高级查询-聚合查询
*/
@RequestMapping("/matchQueryAgg")
public void matchQueryAgg() {
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 不查询任何结果
queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""},
null));
// 1、添加一个新的聚合,聚合类型为terms,聚合名称为brands,聚合字段为brand
queryBuilder.addAggregation(
AggregationBuilders.terms("images").field("image"));
// 2、查询,需要把结果强转为AggregatedPage类型
AggregatedPage<Goods> aggPage = (AggregatedPage<Goods>)
goodsRepository.search(queryBuilder.build());
// 3、解析
// 3.1、从结果中取出名为pimgs的那个聚合,
Terms agg = (Terms) aggPage.getAggregation("images");
// 3.2、获取桶
List<StringTerms.Bucket> buckets = (List<StringTerms.Bucket>)
agg.getBuckets();
// 3.3、遍历
for (Terms.Bucket bucket : buckets) {
// 3.4、获取桶中的key,即图片
System.out.println(bucket.getKeyAsString());
// 3.5、获取桶中的文档数量
System.out.println(bucket.getDocCount());
}
}

3、高亮查询

//创建elasticsearch操作类
public interface GoodsRepository extends
ElasticsearchRepository<Goods,Long> {
//高亮处理
@Highlight(
fields = {@HighlightField(name = "title"),@HighlightField(name
= "brand")},
parameters = @HighlightParameters(preTags = {"<span
style='color:red'>"},postTags = {"</span>"})
)
public List<SearchHit<Goods>> findByTitleOrBrand(String title,String
brand);
}
//高亮查询
@RequestMapping("/findByTitleOrBrand")
public List<Goods> findByTitleOrBrand(){
//根据标题和品牌获取高亮数据,分为两部分:1.普通数据{id:1,title:小米手
机} 2.高亮的部分 title:小米<span style='color:red'>手机</span>
List<SearchHit<Goods>> list =
goodsRepository.findByTitleOrBrand("手机", "手机");
List<Goods> newList = new ArrayList<>();
for (SearchHit searchHit:list) {
//获取普通数据
Goods goods = (Goods) searchHit.getContent();
//获取高亮的数据
/*{
title:[
"小米<span style='color:red'>手机</span>"
],
brand:[
"小米<span style='color:red'>手机</span>"
]
}
*/
Map<String,List<String>> highlightFields =
searchHit.getHighlightFields();
//获取title的高亮数据
List<String> titles = highlightFields.get("title");
if (titles != null){
goods.setTitle(titles.get(0));
}
List<String> brands = highlightFields.get("brand");
2.elasticsearch集群
2.1.搭建集群
Elasticsearch如果做集群的话节点至少三台服务器或者三个实例加入相同集群,三个节点最多只
能故障一台节点,如果故障两个节点,Elasticsearch将无法组成集群.会报错,Kibana也无法启
动,因为Kibana无法获取集群中的节点信息。
由于,我们使用只有一台虚拟机,所以我们在虚拟机中安装三个ES实例,搭建伪集群。
2.1.1.拷贝副本
修改elasticsearch的JVM占用内存参数,防止内存不足错误
默认情况下,ES启动JVM最小内存1G,最大内存1G
将opt目录下的elasticsearch安装目录拷贝3个
2.1.2. 修改elasticsearch.yml配置文件
创建日志目录
if (brands != null){
goods.setBrand(brands.get(0));
}
//把处理好的数据存储到list中
newList.add(goods);
}
return newList;
}

五、es专业名词

节点

分片

副本

索引

六、mysq+es的数据同步

当前项目

主数据库: mysql 事务机制

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

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

mysql:商品表

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

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

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

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

项目运行:增量同步

### 如何在Spring Boot项目中集成ELK #### 集成概述 ELK 是 Elasticsearch、Logstash 和 Kibana 的缩写,是一个强大的日志管理与分析工具组合。通过将 ELK 集成到 Spring Boot 项目中,可以实现集中化的日志收集、存储和可视化功能[^1]。 --- #### 实现步骤说明 ##### 1. 添加依赖项 为了使 Spring Boot 应用程序能够向 Logstash 发送数据,需引入 `logback` 或其他支持的日志框架作为中间件。以下是 Maven 中的配置示例: ```xml <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>7.0</version> </dependency> ``` 此依赖允许应用程序以 JSON 格式记录消息并发送给 Logstash 进行处理。 ##### 2. 配置 logback.xml 文件 创建或修改项目的 `src/main/resources/logback-spring.xml` 文件来定义自定义日志输出格式。下面展示了一个基本设置例子: ```xml <?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="LOGSTASH" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="net.logstash.logback.encoder.LogstashEncoder"/> </appender> <root level="info"> <appender-ref ref="LOGSTASH"/> </root> </configuration> ``` 上述 XML 片段设置了控制台输出器 (Console Appender),它会把每条日志转换为适合 Logstash 解析的形式。 ##### 3. 设置 Logstash 输入插件 编辑 Logstash 的配置文件(通常位于 `/etc/logstash/conf.d/`),指定监听端口以及输入源类型如下所示: ```plaintext input { tcp { port => 5000 codec => json_lines } } output { elasticsearch { hosts => ["http://localhost:9200"] } } ``` 这里我们假设本地运行着一个可用的 ElasticSearch 实例;如果实际部署环境不同,则需要调整相应的地址参数。 ##### 4. 启动服务组件 依次启动三个主要的服务部分——Elasticsearch、Logstash 及最后的前端界面 Kibana。可以通过 Docker Compose 方便快捷地完成整个堆栈的一键安装操作[^2]: ```yaml version: '3' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1 ports: - "9200:9200" kibana: image: docker.elastic.co/kibana/kibana:7.10.1 depends_on: - elasticsearch ports: - "5601:5601" logstash: build: ./logstash/ volumes: - ./logstash/config:/usr/share/logstash/config ports: - "5000:5000/tcp" links: - elasticsearch ``` 以上 YAML 定义了容器间的关系和服务暴露的具体网络映射关系。 --- #### 结果验证 当所有部件都正常工作之后,在浏览器访问 http://localhost:5601 即可进入 Kibana 控制面板查看实时传入的应用级事件流信息,并利用其内置的强大查询语法执行进一步的数据挖掘任务。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值