Elasticsearch学习(3) spring boot整合Elasticsearch的原生方式
前面我們已經(jīng)介紹了spring boot整合Elasticsearch的jpa方式,這種方式雖然簡(jiǎn)便,但是依舊無法解決我們較為復(fù)雜的業(yè)務(wù),所以原生的實(shí)現(xiàn)方式學(xué)習(xí)能夠解決這些問題,而原生的學(xué)習(xí)方式也是Elasticsearch聚合操作的一個(gè)基礎(chǔ)。
一、修改spring boot 的application.properties配置文件
?
##端口號(hào) server.port=8880 ##es地址 spring.data.elasticsearch.cluster-nodes =127.0.0.1:9300?
? ? ? 需要注意的是:如果你的項(xiàng)目中只配置了Elasticsearch的依賴或者是其他nosql的依賴,那么就要在spring boot啟動(dòng)類中添加@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})注解,這個(gè)操作是關(guān)閉自動(dòng)配置數(shù)據(jù)源文件信息。
?
二、創(chuàng)建一個(gè)Bean層
和spring boot的jpa方式一樣,我們需要?jiǎng)?chuàng)建一個(gè)bean來作為我們的索引,注意indexName和type的值是你需要查找的索引內(nèi)容。
import org.springframework.data.elasticsearch.annotations.Document;@Document(indexName = "article",type = "center") public class Zoo {private int id;private String animal;private Integer num;private String breeder;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getAnimal() {return animal;}public void setAnimal(String animal) {this.animal = animal;}public Integer getNum() {return num;}public void setNum(Integer num) {this.num = num;}public String getBreeder() {return breeder;}public void setBreeder(String breeder) {this.breeder = breeder;}public Zoo(int id, String animal, Integer num, String breeder) {super();this.id = id;this.animal = animal;this.num = num;this.breeder = breeder;}public Zoo() {super();}} bean層代碼三、創(chuàng)建一個(gè)dao層
??創(chuàng)建的dao層中不需要我們寫實(shí)現(xiàn)的方法,只需要繼承ElasticsearchRepository接口。
import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;@Configuration public interface ZooMapper extends ElasticsearchRepository<Zoo,Integer>{} dao層代碼四、創(chuàng)建一個(gè)Controller層,編寫原生代碼
?一般來說這個(gè)操作規(guī)范下應(yīng)該寫到service層,由于是測(cè)試項(xiàng)目,我就直接寫在了controller中,我們直接看一個(gè)例子
import java.util.List;import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.sort.FieldSortBuilder; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;@RestController public class UserController {@AutowiredZooMapper zooMapper;// 訪問接口地址:localhost:8880/find //存儲(chǔ)數(shù)據(jù)@GetMapping("find")public Object save(){//1.創(chuàng)建QueryBuilder 可以理解為裝查詢條件的容器BoolQueryBuilder builder = QueryBuilders.boolQuery();//2.設(shè)置查詢條件,參數(shù)1: 字段名 參數(shù)2:字段值(為什么中文是一個(gè)字而不是詞,這個(gè)后面在說)QueryBuilder queryBuilder1=QueryBuilders.termQuery("breeder", "飼");//設(shè)置查詢條件多個(gè)匹配,參數(shù)1: 字段名 參數(shù)2:字段值 參數(shù)3:字段值QueryBuilder queryBuilder2=QueryBuilders.termsQuery("animal", "rabbit","lion");//3.將查詢的條件放入容器中//其中 must相當(dāng)于SQL中的and should相當(dāng)于SQL中的or mustNot相當(dāng)于SQL中的not builder.must(queryBuilder1);builder.should(queryBuilder2);//4.設(shè)置排序 參數(shù):需要排序字段 DESC表示降序FieldSortBuilder sort = SortBuilders.fieldSort("id").order(SortOrder.DESC);//5.設(shè)置分頁,參數(shù)1:第幾頁開始(第一頁是0),參數(shù)2:顯示的條數(shù) //在spring 2.0開始后,使用PageRequest.of創(chuàng)建分頁參數(shù)PageRequest page =PageRequest.of(0, 2);//6.在設(shè)置好查詢條件、排序設(shè)置、分頁設(shè)置后需要將他們放入NativeSearchQueryBuilder 容器中NativeSearchQueryBuilder nativeSearchQueryBuilder =new NativeSearchQueryBuilder();//將查詢條件放入容器中 nativeSearchQueryBuilder.withQuery(builder);//將分頁放入容器中 nativeSearchQueryBuilder.withPageable(page);//將排序放入容器中 nativeSearchQueryBuilder.withSort(sort);//最后將容器組裝后,生產(chǎn)NativeSearchQuery//此時(shí) SearchQuery中的sql為//select * from zoo where breeder="飼養(yǎng)員1號(hào)" or animal in("rabbit","lion") ORDER BY id DESC LIMIT 0,2SearchQuery query = nativeSearchQueryBuilder.build();System.out.println("查詢的語句:" + query.getQuery().toString());//7.開始查詢Page<Zoo> listPage = zooMapper.search(query); //獲取總條數(shù)int total = (int) listPage.getTotalElements();//獲取查詢的內(nèi)容List<Zoo> relist = listPage.getContent();System.out.println("relist----------------"+relist.toString());return relist;}} controller層代碼在測(cè)試之前,我們需要在Elasticsearch中添加一個(gè)索引,這個(gè)索引和我們剛才創(chuàng)建的bean中配置的indexName和type的值一致。
打開 http://localhost:8888/find,測(cè)試我們的代碼:
? 這樣做原生的實(shí)現(xiàn)方式就已經(jīng)成功了,接下來就將具體介紹代碼中的具體步驟
六、查詢條件的具體步驟
這一節(jié)主要講解查詢條件的具體功能,在controller中,有這樣一段代碼:
//2.設(shè)置查詢條件,參數(shù)1: 字段名 參數(shù)2:字段值(為什么中文是一個(gè)字而不是詞,這個(gè)后面在說)QueryBuilder queryBuilder1=QueryBuilders.termQuery("breeder", "飼");//設(shè)置查詢條件多個(gè)匹配,參數(shù)1: 字段名 參數(shù)2:字段值 參數(shù)3:字段值QueryBuilder queryBuilder2=QueryBuilders.termsQuery("animal", "rabbit","lion");在這個(gè)步驟我們可以看到breeder的值是中文且中文是一個(gè)字而不是詞,這是因?yàn)闆]有使用分詞器的原因,Elasticsearch默認(rèn)的分片是將中文分解成一個(gè)字,英文是單個(gè)單詞:
?? 1 設(shè)置查詢條件
//不分詞查詢 參數(shù)1: 字段名,參數(shù)2:字段查詢值,因?yàn)椴环衷~,所以漢字只能查詢一個(gè)字,英語是一個(gè)單詞.QueryBuilder queryBuilder=QueryBuilders.termQuery("breeder", "飼"); //分詞查詢,采用默認(rèn)的分詞器QueryBuilder queryBuilder2 = QueryBuilders.matchQuery("breeder", "飼養(yǎng)"); //多個(gè)匹配的不分詞查詢QueryBuilder queryBuilder=QueryBuilders.termsQuery("animal", "rabbit","lion"); //多個(gè)匹配的分詞查詢QueryBuilder queryBuilder= QueryBuilders.multiMatchQuery("animal", "r", "l"); //匹配所有文件,相當(dāng)于就沒有設(shè)置查詢條件QueryBuilder queryBuilder=QueryBuilders.matchAllQuery();2模糊查詢
? ? 除了設(shè)置普通的查詢,elasticsearch還為我們封裝了模糊查詢
//1.常用的字符串查詢//相當(dāng)于sql中的 breeder like "飼"QueryBuilders.queryStringQuery("飼").field("breeder");//2.推薦與該文檔相識(shí)的文檔//參數(shù)1:字段名 參數(shù)2:文檔內(nèi)容//如果不指定第一個(gè)參數(shù),則默認(rèn)全部,這個(gè)是主要用來推薦偏好內(nèi)容QueryBuilders.moreLikeThisQuery(new String[] {"animal"}).addLikeText("rabbit");//3.分詞的字段片查詢,比如飼養(yǎng)員1號(hào)能夠被中文分詞器分為:飼養(yǎng)員 1 號(hào)//使用下面的方法就能查詢‘飼養(yǎng)員’這個(gè)片段,如果沒有配置分詞器,就查詢?nèi)?/span>QueryBuilders.prefixQuery("breeder","飼養(yǎng)員 ");//4.通配符查詢,支持* 任意字符串;?任意一個(gè)字符與sql中的? *類似//參數(shù)1:字段名 參數(shù)2字段值QueryBuilders.wildcardQuery("animal","r??b*");在第二條偏好文檔設(shè)置中有一個(gè)偏好的權(quán)重問題,如果感興趣可以參考這個(gè)博客:https://blog.csdn.net/laigood/article/details/7831713
3 邏輯查詢
//閉區(qū)間 相當(dāng)于id>=2 and id<=5QueryBuilder queryBuilder0 = QueryBuilders.rangeQuery("id").from("2").to("5");//開區(qū)間 相當(dāng)于id>2 and id<5//至于后面兩個(gè)參數(shù)的值默認(rèn)為true也就是閉區(qū)間//如果想半開半閉只需要調(diào)整后面兩個(gè)參數(shù)的值即可QueryBuilder queryBuilder1 = QueryBuilders.rangeQuery("id").from("2").to("5").includeUpper(false).includeLower(false);//大于 id>2QueryBuilder queryBuilder2 = QueryBuilders.rangeQuery("id").gt("2");//大于等于 id>=2QueryBuilder queryBuilder3 = QueryBuilders.rangeQuery("id").gte("2");//小于 id <5QueryBuilder queryBuilder4 = QueryBuilders.rangeQuery("id").lt("5");//小于等于 id <=5QueryBuilder queryBuilder5 = QueryBuilders.rangeQuery("id").lte("5");以上就是spring boot整合Elasticsearch的原生方式所有實(shí)現(xiàn)方式,這個(gè)方式主要是后面的聚合查詢的基礎(chǔ)。
?
轉(zhuǎn)載于:https://www.cnblogs.com/daijiting/p/10209746.html
總結(jié)
以上是生活随笔為你收集整理的Elasticsearch学习(3) spring boot整合Elasticsearch的原生方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金杯大海狮车身控制模块在哪里?
- 下一篇: java泛型bean copy list