前言
spring里有兩個(gè)比較好用的操作ES的工具,一個(gè)是spring data elasticsearch钧栖,一個(gè)是Jest低零,前者連接的是es的9300端口(TCP連接,把自己偽裝成ES的一個(gè)節(jié)點(diǎn))拯杠;后者連接的是es的9200端口(Http Restful)掏婶。
1、整合Jest
step1
搭建SpringBoot項(xiàng)目潭陪,引入Jest依賴雄妥,和spring data elasticsearch依賴,引入兩個(gè)依賴是因?yàn)镴est使用過程中會(huì)用到spring data elasticsearch的一些類依溯,如QueryBuilder老厌。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>5.3.3</version>
</dependency>
step2
application.yml里面配置ES的連接和端口。如果有認(rèn)證需要加上用戶名密碼等黎炉,其他配置可以參考官方文檔枝秤。
spring:
elasticsearch:
jest:
uris: http://166.66.66.266:9200
step3
生產(chǎn)環(huán)境用到的查詢語句一般是復(fù)雜的DSL,DSL一般有以下幾種查詢類型(過濾器)慷嗜。ES中的每種查詢都有對(duì)應(yīng)的QueryBuilder提供淀弹。
- term/terms:精確查找。下面用到了terms查詢洪添,查找loglevel是ERROR或者FATAL的文檔垦页。記住精確查找用termQuery/termsQuery構(gòu)建就行了,方法ide會(huì)給提示
QueryBuilder levelClause = QueryBuilders.termsQuery("loglevel.keyword", "ERROR", "FATAL");
- range:范圍查找干奢。下面的查詢是找出logtime從startTime到endTime的所有文檔痊焊。記住范圍查找用rangeQuery構(gòu)建就行了
QueryBuilder timeClause = QueryBuilders.rangeQuery("logtime.keyword").from(startTime).to(endTime);
- match:匹配查詢,模糊查詢,只要查詢的字段包含你的詞就可以了,后面可以加分析器等薄啥。參考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/phrase-matching.html
QueryBuilder queryBuilder = QueryBuilders.matchQuery("logclass.keyword","com.huohuo.Test").;
- and/or/not等:涉及到多條件查詢用boolQuery辕羽,組合多個(gè)query。must表示and垄惧,mustNot表示not刁愿,should表示or。
QueryBuilder allClause = QueryBuilders.boolQuery().must(timeClause).must(levelClause);
step4
條件構(gòu)建完成之后需要配置下搜索器SearchSourceBuilder到逊。搜索器通過size設(shè)置搜索多少條記錄铣口,from設(shè)置從第幾條開始,fetchSource設(shè)置取回哪些字段觉壶,timeout設(shè)置搜索超時(shí)時(shí)間脑题,query設(shè)置查詢的條件等等。
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
String[] sources = {"source", "hostname", "class", "content", "content", "logtime"};
searchSourceBuilder.query(allClause)
.fetchSource(sources, null)
.size(10000)
.timeout(new TimeValue(10, TimeUnit.SECONDS));
step5
搜索器構(gòu)造完成了铜靶,下面開始搜索叔遂?nonono!你得告訴搜索器搜索哪個(gè)Index啊争剿,Index下的哪個(gè)Type啊等等已艰。
Search search = new Search.Builder(searchSourceBuilder.toString())
.addIndex(esIndex)
.addType("doc")
.build();
step6
執(zhí)行搜索,處理搜索結(jié)果蚕苇。如果你的對(duì)象(下面用User)和結(jié)果中的JSON串中的字段一一對(duì)應(yīng)哩掺,可以使用getSourceAsObjectList來直接綁定,如果不是一一對(duì)應(yīng)的捆蜀,你也可以自己寫一個(gè)方法通過fastjson等工具進(jìn)行綁定疮丛!
SearchResult result = jestClient.execute(search);
List<Log> list = result.getSourceAsObjectList(Log.class,true);
List<String> docList = result.getSourceAsStringList();
esInfoList = parseDocListToBeanList(docList);
總結(jié)
使用上面的方法最好單獨(dú)封裝一層,比如抽出已成ESDAO層辆它,專門用于ES查詢誊薄,這樣后期便于維護(hù)。
2锰茉、整合Data ElasticSearch
Spring Data提供了一個(gè)叫做Repository的數(shù)據(jù)訪問層抽象呢蔫。把之前與Redis,Sql飒筑,ElasticSearch片吊,MongoDB等交互的代碼做了統(tǒng)一管理。參考文檔:https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/协屡,有中文版的可以自己搜索以下俏脊。
step1
搭建SpringBoot項(xiàng)目,引入一個(gè)maven即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
step2
配置application.yml文件。端口一定要9300肤晓,9300表示TCP端口爷贫,ES用java編寫认然,使用9300相當(dāng)于偽裝成ES的一個(gè)節(jié)點(diǎn)。9200是給Restful請(qǐng)求提供的接口漫萄,http協(xié)議的卷员。
spring:
data:
elasticsearch:
cluster-nodes: localhost:9300
step3
構(gòu)建Entity,Entity對(duì)象與ES中的doc一一對(duì)應(yīng)腾务,@Data使用了lombok毕骡,indexName是索引名稱,type是文檔類型岩瘦,Id指明文檔唯一標(biāo)識(shí)
@Data
@Document(indexName = "users",type = "User")
public class User {
@Id
private Integer id;
private String userName;
private String password;
private String phoneNumber;
private String address;
private Integer age;
private Date hireDate;
}
step4
繼承ESRepository接口即可完成數(shù)據(jù)交互層的編寫未巫,UserRepository上不用加注解,其他SpringBean可以自由的@Autowire注入該類启昧。該類中也可以加一些自己的方法橱赠,方法名字是有規(guī)范的,參考文檔里的就行箫津。
/**
* @Author: 小混蛋
* @CreateDate: 2018/8/30 16:54
*/
public interface UserRepository extends ElasticsearchRepository<User,Integer> {
List<User> findUserByPhoneNumber(String phoneNumber);
}
測試類,發(fā)現(xiàn)可行宰啦。
@RestController
public class UserService {
@Autowired
private UserRepository userRepository;
@GetMapping("/testSave")
public void testSave(){
User user = new User();
user.setId(1);
user.setAge(10);
user.setUserName("小娜");
user.setHireDate(new Date());
user.setPassword("secret");
user.setAddress("大于");
user.setPhoneNumber("13888888888");
userRepository.save(user);
}
@GetMapping("testGet")
public Iterable<User> testFind(){
Iterable<User> all = userRepository.findUserByPhoneNumber("13888888888");
for(User user : all){
System.out.println(user);
}
return all;
}
}
總結(jié)
Spring data還有很多其他工具苏遥,如RedisTemplate,JPA等赡模。有興趣的可以去發(fā)掘哦田炭!