這段時(shí)間要寫一個(gè)提供查詢elasticsearch的接口,特在這里講自己的一些問題情況記錄一下悬垃。
首先是創(chuàng)建工程拔鹰,spring boot+ES的這里就不過多的寫了。
pom文件如下:
在application.properties中添加配置:
server.port=8083
spring.data.elasticsearch.cluster-name=這里是ES的名稱
spring.data.elasticsearch.cluster-nodes=這里是ES的地址以及端口號(hào)
spring.data.elasticsearch.repositories.enabled=true
這里使用的是spring-data-elasticsearch涣觉,所以在Dao中只要繼承ElasticsearchRepository就可以了痴荐。
例如:public interface Mf_cus_customerRepository extends ElasticsearchRepository<Mf_cus_customer,String> {}
這篇文章主要是記錄查詢的一些方法,所以只針對(duì)查詢官册。
使用QueryBuilder來創(chuàng)建查詢
1生兆、單字段匹配(單條)
/**
* 單字段匹配查詢
* @param searchContent
* @return
*/
public List<Mf_cus_customer> test_search(String searchContent){
QueryBuilder queryBuilder = QueryBuilders.termQuery("這里是你要查詢的字段", searchContent);
? ? SearchQuery searchQuery =new NativeSearchQueryBuilder().withQuery(queryBuilder).build();
? ? System.out.println("查詢的語句:" + searchQuery.getQuery().toString());
? ? Page<Mf_cus_customer>?searchPageResults =mfCusCustomerRepository.search(searchQuery);
? ? return searchPageResults.getContent();
}
這里要注意的是QueryBuilders的termQuery方法以及matchQuery方法,這兩個(gè)方法都可以進(jìn)行單字段匹配的查詢膝宁,但是這兩個(gè)是有區(qū)別的鸦难。具體區(qū)別原理還沒有學(xué)習(xí)根吁,但是如果你的字段不是一個(gè)整體(類似cus_name)這樣的就需要使用matchQuery或者是termQuery的第一個(gè)參數(shù)也就是你的字段后面加上.keyword。也就是說如果字段是一個(gè)整體那么這兩個(gè)方法是一樣的效果合蔽,例如:
matchQuery("name","張三")等價(jià)于termQuery("name","張三")击敌。如果字段不是一個(gè)整體,那么這兩個(gè)的效果如下:
matchQuery("cus_name","張三")等價(jià)于termQuery("cus_name.keyword","張三")拴事。
2沃斤、單字段匹配(多條)
/**
* 一次匹配多個(gè)值
* @param searchContent
* @return
*/
public List<Mf_cus_customer> test_searchs(String searchContent){
List searchContents = Arrays.asList(searchContent.split(","));
? ? QueryBuilder queryBuilder = QueryBuilders.termsQuery("cus_no.keyword", searchContents);//cus_no字段查詢
? ? SearchQuery searchQuery =new NativeSearchQueryBuilder().withQuery(queryBuilder).build();
? ? System.out.println("查詢的語句:" + searchQuery.getQuery().toString());
? ? Page<Mf_cus_customer> searchPageResults =mfCusCustomerRepository.search(searchQuery);
? ? return searchPageResults.getContent();
}
匹配多條使用的是termsQuery方法,問題同上刃宵。
3轰枝、分頁
分頁的話這里是用的是簡單的方法,后期學(xué)到其他分頁還會(huì)繼續(xù)分享组去。
這里的分頁使用的是Pageable鞍陨,例如:
Pageable pageable =new PageRequest(pageNumber, pageSize);
然后在new?NativeSearchQueryBuilder()后添加withPageable(pageable?)即可。
/**
* 有分頁的按照userID查詢
* @param pageNumber
* @param pageSize
* @param searchContent
* @return
*/
public List<Mf_cus_customer> _searchByUserid(Integer pageNumber, Integer pageSize,String searchContent){
Pageable pageable =new PageRequest(pageNumber, pageSize);
? ? QueryStringQueryBuilder builder =new QueryStringQueryBuilder(searchContent);
? ? SearchQuery searchQuery =new NativeSearchQueryBuilder().withPageable(pageable).withQuery(builder).build();
? ? System.out.println("查詢的語句:" + searchQuery.getQuery().toString());
? ? Page<Mf_cus_customer> searchPageResults =mfCusCustomerRepository.search(searchQuery);
? ? return searchPageResults.getContent();
}
4从隆、范圍查詢
使用QueryBuilders的rangeQuery方法诚撵,來進(jìn)行范圍查詢,其中
大于:QueryBuilder qb1 = QueryBuilders.rangeQuery("字段").gt(值);
大于等于:QueryBuilder qb1 = QueryBuilders.rangeQuery("字段").gte(值);
小于:QueryBuilder qb1 = QueryBuilders.rangeQuery("字段").lt(值);
小于等于:QueryBuilder qb1 = QueryBuilders.rangeQuery("字段").lte(值);
5键闺、多條件查詢
使用QueryBuilders的boolQuery方法可以進(jìn)行多條件查詢寿烟,即sql語句中的and和or查詢
這里and是must(),or是should()辛燥;
例如:
QueryBuilder qb1 = QueryBuilders.termsQuery("字段", 值);
QueryBuilder qb2 = QueryBuilders.rangeQuery("字段").gt(值);
QueryBuilder qb3 = QueryBuilders.boolQuery().must(qb1).must(qb2);//and鏈接兩個(gè)查詢條件筛武,or的話使用should()。
這些是簡單查詢的部分功能挎塌,在項(xiàng)目中用到了徘六,后續(xù)如果有其他的使用會(huì)繼續(xù)記錄。