Elasticsearch 是一个分布式的全文检索引擎。采用Java语言开发,基于Apache协议的开源项目,具有实时搜索,稳定,可靠,快速的特点。
分为通用搜索引擎(百度、谷歌)与站内搜索引擎,全文检索在处理非结构化文本数据方面非常有用
每个属性都有对应的字段的数据就是结构化数据,反之无法用二维表表述的数据就是非结构化数据
Elasticsearch基于Lucene库构建而成,它使用了倒排索引的方式来实现全文检索。
就是查找内容,根据内容得到内容所在文档
就是通过路径找到文档,再从文档找某段内容
Elasticsearch:官方分布式搜索和分析引擎 | Elastic在 RESTful 风格的分布式免费开源搜索和分析引擎开源中,Elasticsearch 处于领先地位,速度快,可实现水平可扩展性和可靠性,并能让您轻松进行管理。免费启用。https://www.elastic.co/cn/elasticsearch/
双击 bin/elasticsearch.bat
TIPS:
启动后ES会占用两个端口。
9200:ES对外提供服务的端口
9300:ES进行集群间通信与数据传输的端口
elasticsearch-8.8.2\config\elasticsearch.yml
elasticsearch-8.8.2\config\jvm.options
http://localhost:9200
常见操作 | |
---|---|
新增索引 | PUT http://localhost:9200/job |
查询索引中数据 | GET http://localhost:9200/job |
删除索引 | DELETE http://localhost:9200/job |
查询所有索引数据 | GET localhost:9200/_all |
查询索引的摘要信息 | GET http://localhost:9200/_cat/indices?v |
获取所有映射 | GET http://localhost:9200/_mapping |
POST http://localhost:9200/job/_close
POST http://localhost:9200/job/_open
类型 | 说明 | 示例 |
text | 当一个字段是要被全文搜索的,比如文章内容、产品描 述等使用text类型。 设置text类型以后,字段内容会被分析,在生成倒排索 引以前,字符串会被分一个一个词项。 |
比如:java软件工程师, 会被分词为 java 、 软 件 、 工程师 |
keyword | keyword类型适用于索引结构化的字段,如果字段需要 进行过滤、排序、聚合。keyword类型的字段只能通过 精确值搜索到。 |
比如:城市,我们搜索北 京、深圳,这类词不应该 被拆分。 |
date | 通过format设置日期格式,常见的可以设置成年月日时分秒、年月日及毫秒值三种格式。 ignore_malformed。默认值false。如果为true,则忽略格式错误的数字。如果为false(默认值),则格式错误的数字将引发异常并拒绝整个文档。 null_value。默认是null。接受采用配置格式之一的日期值作为该字段,以替换任何显式的空值。默认为null,这意味着该字段被视为丢失。 |
|
byte,short,integer,long | 整型 | 比如:职位ID、薪水。 |
float, half_float, scaled_float,double | 浮点型 | |
integer_range, long_range, float_range,double_range,date_range | 范围型 |
Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷。包括非关系数据库、Map-Reduce 框架、云数据服务、关系数据库的访问支持等。
Spring Data ElasticSearch 基于 Spring Data API 简化 ElasticSearch操作,将原始操作ElasticSearch的客户端API 进行封装 。与ElastichSearch交互简化数据访问层开发。
注意使用的JDK版本应与ES版本的兼容问题
org.springframework.boot
spring-boot-starter-data-elasticsearch
spring:
elasticsearch:
uris: http://localhost:9200
@Data
@Document(indexName = "esgoods") //indexName:索引的名称(必填项)
public class Goods {
@Id //主键的唯一标识
private Integer id;
//index:是否设置分词。searchAnalyze:搜索时使用的分词器。type: 数据类型
@Field(index = true,type = FieldType.Text,searchAnalyzer = "ik_smart")
private String name;
private Integer stock; // 库存
@Field(type = FieldType.Text,searchAnalyzer = "ik_smart")
private String description; // 描述
}
注解 | 作用 |
---|---|
@Document(indexName = "esgoods") | 用于指定该Java类映射到Elasticsearch中的索引名称。在这里,该类映射到名为"esgoods"的索引。 |
@Id | 用于标记文档的主键字段。在这里,id字段将被用作文档的主键。 |
@Field(index = true, type = FieldType.Text, searchAnalyzer = "ik_smart") | 用于配置类中的字段。在这里,name字段将被映射为Elasticsearch文档的一个字段,并且允许进行分词索引,使用的分词器是"ik_smart"。 |
继承ElasticsearchRepository接口可以获得常用的数据操作方法
@Repository
public interface EsGoodsRepository extends ElasticsearchRepository {
Page findByNameOrDescriptionOrderByIdDesc(String name, String description, Pageable pageable);
}
ElasticsearchRepository接口是Spring Data Elasticsearch库提供的接口之一,它继承自Spring Data的CrudRepository接口,因此具备了常见的CRUD操作方法,如保存、查询、更新和删除等。
Spring Data Elasticsearch - Reference Documentationhttps://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.repositories
@Override
public int importAll() {
List goods = goodsMapper.selectAll();
Iterable iterable = goodsRepository.saveAll(goods);
Iterator iterator = iterable.iterator();
int count = 0;
while (iterator.hasNext()) {
iterator.next();
count++;
}
return count;
}
@Override
public Page search(String keyword, Integer pageNum, Integer pageSize) {
return goodsRepository.findByNameOrDescriptionOrderByIdDesc(keyword,keyword,PageRequest.of(pageNum,pageSize));
}