Elasticsearch是一个基于lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。
通过在java中整合ES搜索
前提是在服务器上,或者在主机上已经下载和部署es
后期我会将在服务器上部署es的教程连接放到评论区哈
这里给大家放一下官方文档的连接
有基础的大佬可直接看官方文档自主学习
Initialization | Java REST Client [7.17] | Elastic
今天主要讲解的是Document APIS与SearCh Apis
首先正常开始搭建spring-boot-could项目
引入依赖
要在java中使用es搜索首先要在pom中引入依赖
<!--es-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
这里我使用的操作是构建了一个客户端来发送请求,需要我直接在配置文件中写了一些提前需要的属性
配置书写
es:
host: **.***.***.*
port: 9200
scheme: http
我的配置文件格式是yml格式host是已经部署es的服务器ip地址,9200是默认的端口号。
配置文件书写
那就需要我们书写一个配置es文件
给大伙提供一下代码,说明一下注解和中间的配置
@Configuration作用是这个类加载的时候加载配置文件
@ConfigurationProperties(prefix="XX")加载时获取前缀为es的配置文件
在书写配置文件的时候我们写了几个属性分别是
host/port/scheme
要注意的是一定要和配置文件中的字段名称相互对应
使用@Bean注解配置一个高级请求对象
@Configuration
@ConfigurationProperties(prefix = "es")
@Data
public class EsConfig {
private String host;//宿主
private int port;//港口
private String scheme;//计划
@Bean
public RestHighLevelClient restHighLevelClient(){
return new RestHighLevelClient(
RestClient.builder(new HttpHost(host, port,scheme))
);
}
}
方便我们使用,这样我们在需要高级请求客户端的时候直接注解就可以使用。方便轻松
整合es的增删改查
es就很网页版的数据库,它的特点就是JSON格式,所以在定义mapping的时候一定要对应好请求,构建对应的请求对象。见名之意也可以减少很多开发的麻烦。
我们使用java代码之前先试用官网的开发者工具先创建一个索引
打开在elastic网站中的开发者工具
还有一个方式能找到开发者工具
创建索引
GET test/_search
DELETE test
PUT test
get 索引名字/_search可以直接查询这个索引里面的所有
delete 索引名字可以直接删除索引
put 新建索引
在创建索引的时候设置映射
直接使用关键字 "mappings"映射,使用"properties"创建设置每一个字段和属性
"title"字段的名字(类比mysql表中的字段),其中"type"是设置字段的属性(类比mysql中的字段的属性eg:varchar...),其中"analyzer"是设置使用的分词器,因为es中自带并没有中文的分词器,默认的话就会给中文每个字都分开,如果需要就使用中文的分词器插件。(如果需要在评论区留言我会抓紧整理出来放上连接)。
"analyzer" 属性用于定义在索引数据时使用的分析器。它定义了文本如何被处理,包括是否进行分词(将文本分成单词)、停用词删除、词干提取等等。
"search_analyzer" 属性则指定在搜索数据时使用的分析器。这可以与 "analyzer" 不同,因为你可能想在搜索时使用更宽松的分析器,以提高匹配的数量。
注意:如果你想使用分词器的时候就不要使用keyword类型的属性,因为keyword属性不支持分词
# 创建文章索引
PUT article
{
"mappings": {
"properties": {
"title":{
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
},
"author": {
"type": "keyword"
},
"type": {
"type": "keyword"
},
"address": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"price":{
"type": "double"
},
"createTime":{
"type": "long"
}
}
}
}
可以不进行映射直接在索引中写入实体类
如果不写映射直接写实体类那么就可能在字段的属性上面发生一些错误(不建议)
整合代码进行增删改查
实体类创建,实体类中写了几个比较常用的属性方法
@Data
public class Test {
private String id;//id
private String name;//姓名
private Date birthday;//生日
private int price;//价格
}
先写一个添加,实际测试如果es库中没有索引,直接创建索引可以直接创建索引
上代码!~
@Service
public class EsServiceImpl implements EsService {
@Autowired
RestHighLevelClient client;
@Override
public Result put(TestReq test) {
//创建索引请求对象传入索引名称
IndexRequest indexRequest = new IndexRequest("test");
/**
* 使用UUid来生成一个id
* 先判断前台传入的信息有没有id
* 给修改和添加放到一起写
* */
//在这里提前整一个结果集的返回对象字符串
String res = "";
//这里是一个提前分装好的工具类
//可以使用 test.getId().equals("")代替
if(StringUtils.isEmpty(test.getId())) {
//如果没有id就使用uuid生成一个id给对象赋值
String id = UUID.randomUUID().toString().replaceAll("-", "");
test.setId(id);
}else {
//如果自带id就将id赋值给indexRequest中的id属性
indexRequest.id(test.getId());
}
//前台传入的数据有id就直接进行操作,那么就是修改操作,因为在es中是覆盖操作(id)相同
//将要添加的对象使用json字符串的形式进行写入
String testString = JSON.toJSONString(test);
//将转换成json字符串的对象传入source(数据)中,第二个参数为指定参数格式为json
indexRequest.source(testString, XContentType.JSON);
//使用高级客户端将请求发送
//使用高级客户端时根据要操作的请求类型来直接使用对应的方法
//注意高级客户端中的方法自带异常,阿丹建议是直接try一下
try {
IndexResponse index = client.index(indexRequest, RequestOptions.DEFAULT);
res = JSON.toJSONString(index);
} catch (IOException e) {
e.printStackTrace();
}
return Result.success(res);
}
}
测试!
我使用的是apipost
大功告成!剩下的请看后续
使用SpringBoot整合ES搜索,elastic在java中体验-Document APIs(2)