Springboot 操作 elasticsearch
Springboot 操作 elasticsearch
一、es 6.8版本
使用高级客户端
pom.xml
<!-- ES 客户端 --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>6.8.22</version></dependency><!-- ES 版本 --><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>6.8.22</version></dependency
application.yml
elasticsearch:host: 10.0.1.192:9200,10.0.1.192:9300
config.java
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class EsConfig {@Value("${elasticsearch.host}")private String hostlist; // 127.0.0.1:9200@Bean // 高版本客户端public RestHighLevelClient restHighLevelClient() {// 解析 host 配置信息。假如以后有多个,则需要用 , 分开String[] split = hostlist.split(",");// 创建 HttpHost 数组,其中存放es主机和端口的配置信息HttpHost[] httpHostArray = new HttpHost[split.length];for (int i = 0; i < split.length; i++) {String item = split[i];httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");}// 创建RestHighLevelClient客户端return new RestHighLevelClient(RestClient.builder(httpHostArray));}// 项目主要使用 RestHighLevelClient,对于低级的客户端暂时不用@Beanpublic RestClient restClient() {// 解析host配置信息String[] split = hostlist.split(",");// 创建HttpHost数组,其中存放es主机和端口的配置信息HttpHost[] httpHostArray = new HttpHost[split.length];for (int i = 0; i < split.length; i++) {String item = split[i];httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");}return RestClient.builder(httpHostArray).build();}
}
service接口
public interface AwGoodsService {public void getAll() ;
}
1、范围查询rangeQuery
实现类
public class AwGoodsServiceImpl implements AwGoodsService {@Autowiredprivate RestHighLevelClient client;@Overridepublic void getAll() {//创建查询请求SearchRequest searchRequest = new SearchRequest("goods");//查询条件SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//创建范围查询RangeQueryBuilder rang = QueryBuilders.rangeQuery("crawl_time").gte("2023-03-08 09:25:31").lte("2023-03-09 07:40:58");//设置范围查询searchSourceBuilder.query(rang);//设置查询结果降序searchSourceBuilder.sort("crawl_time", SortOrder.DESC);//设置查询主体searchRequest.source(searchSourceBuilder);//执行查询SearchResponse response = null;try {response = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(response);} catch (IOException e) {throw new RuntimeException(e);}//获取结果SearchHits hits = response.getHits();List<AwGoodsDo> all = new ArrayList<>();SearchHit[] smallHits = hits.getHits();for (SearchHit smallHit : smallHits) {String sourceAsString = smallHit.getSourceAsString();AwGoodsDo awGoodsDo= JSON.parseObject(sourceAsString, AwGoodsDo.class);all.add(awGoodsDo);}System.out.println("111111"+all.get(0).toString());System.out.println("!!!!!"+all.toString());}}
注意:
执行不同语句是不同api 比如SearchXX、GetXX、CreateXX等等
2、精确查询termQuery
//describe字段中含有特价的查询出来
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("describe", "特价"));
或者
TermQueryBuilder term = QueryBuilders.termQuery("describe", "特价"));
searchSourceBuilder.query(term)
注意:
不同查询就是构建不同XXQuery
searchSourceBuilder.query(XXQuery)
学习于https://maimai.cn/article/detail?fid=1744761944&efid=4C4zcI79tmI0h5aTGq_LRA
二、es 7.0以上
推荐使用easy-es 类似于mybatis plus 操作MySQL数据库
<!-- 引入easy-es的依赖,类似与mybatis plus操作es--><dependency><groupId>cn.easy-es</groupId><artifactId>easy-es-boot-starter</artifactId><version>1.1.1</version></dependency><!-- 排除springboot中内置的es依赖,以防和easy-es中的依赖冲突--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId></exclusion><exclusion><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.14.0</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.14.0</version></dependency>
application.yaml
easy-es:address: 10.0.1.192:9200,10.0.1.192:9300 # es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开keep-alive-millis: 30000 # 心跳策略时间 单位:msconnect-timeout: 5000 # 连接超时时间 单位:mssocket-timeout: 600000 # 通信超时时间 单位:msrequest-timeout: 5000 # 请求超时时间 单位:msconnection-request-timeout: 5000 # 连接请求超时时间 单位:msmax-conn-total: 100 # 最大连接数 单位:个max-conn-per-route: 100 # 最大连接路由数 单位:个
实体
@Data
@AllArgsConstructor
@NoArgsConstructor
@IndexName(value = "user",keepGlobalPrefix = true) //索引名
public class UserDo {//es的id(_id)//IdType.NONE: 由ES自动生成,是默认缺省时的配置,无需您额外配置 推荐//IdType.UUID: 系统生成UUID,然后插入ES (不推荐)//IdType.CUSTOMIZE: 由用户自定义,用户自己对id值进行set,如果用户指定的id在es中不存在,则在insert时就会新增一条记录,如果 用户指定的id在es中已存在记录,则自动更新该id对应的记录//实体类中被作为ES主键的字段@IndexIdprivate String id;//es 对应的字段名 字段类型@IndexField(value = "user_name" ,fieldType = FieldType.KEYWORD)private String userName;}
mapper
public interface UserMapper extends BaseEsMapper< UserDo> {
}
启动类扫描
@EsMapperScan(包路径)
service接口
public interface UserService {
}
service实现类
@Service
public class UserServiceImpl implementsUserService {@Autowiredprivate UserMapper userMapper;//查询创建时间(create_time)在某个时间段的数据,方法传入起止时间和结束时间字符串public List<UserDo> getAllByInterval(String startDate, String endDate) {LambdaEsQueryWrapper<UserDo> wrapper = new LambdaEsQueryWrapper<>();wrapper.ge("create_time_time",startDate);wrapper.le("create_time_time",endDate);List<UserDo> all = userMapper.selectList(wrapper);return all;}
}
注意:复杂的查询语句通过Wrapper构建
easy-es官网https://www.easy-es.cn/