Elasticsearch概述和DSL查詢總結
一、Elasticsearch概述
1. 什么是Elasticsearch
Elasticsearch是基于Lucene的搜索服務器,它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用java開發(fā)的,開源,是當前流行的企業(yè)級搜索引擎。
2. 作用
?Elasticsearch具有極快的搜索速度,可以在幾乎實時的時間內對大規(guī)模數據進行搜索和查詢;它利用倒排索引和分布式搜索技術,使搜索操作變得高效,并能夠多種查詢方式進行全文搜索、短語匹配、模糊搜索等。
3. 特點
能夠實時搜索,穩(wěn)定,可靠,快速并且安裝使用方便。
分布式和可擴展性:Elasticsearch基于分布式架構,可以將數據分布在多臺服務器上,實現數據的水平分片和復制。這使得它能夠處理海量數據,并具有高可用性和容錯能力。通過添加或刪除節(jié)點,可以輕松地擴展集群的容量和性能。

概念和作用
DSL查詢是一種基于JSON的查詢語言,用于構建復雜的查詢和過濾條件,以檢索和過濾文檔。DSL查詢提供了豐富的查詢語法和靈活的組合方式,可以根據用戶需求構建定制化的查詢邏輯。
查詢代碼總結
重復代碼:
@Autowired? ?//注入客戶端
? ? RestHighLevelClient client;?
SearchRequest searchRequest = new SearchRequest("abc");? //參數為索引名
searchRequest.types("doc");? //參數為類型
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();? //創(chuàng)建查找源構造器
SearchResponse searchResponse = client.search(searchRequest);??
一、分頁查詢
//分頁查詢,設置起始下標,從0開始?
searchSourceBuilder.from(0); //工作中可以套公式計算出起始值(page-1)*size
//每頁顯示個數?
searchSourceBuilder.size(10);?
二、Term精準查詢
searchSourceBuilder.query(QueryBuilders.termQuery("name","spring"));?
三、根據id精準匹配
searchSourceBuilder.query(QueryBuilders.termsQuery("_id", idList));?
四、match全文檢索
先將搜索字符串分詞,再使用各個詞條從索引中搜索。
searchSourceBuilder.query(
? ? QueryBuilders.matchQuery("description", "spring開發(fā)")
? ? ? ? .operator(Operator.OR));
五、multi一次匹配多個字段
單項匹配是在一個field中去匹配,多項匹配是拿關鍵字去多個Field中匹配。
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring框架", "name", "description") .minimumShouldMatch("50%");?
multiMatchQueryBuilder.field("name",10);//提升boost顯示級別
六、布爾查詢
must:文檔必須匹配must所包括的查詢條件,相當于 “AND”。 表示必須,多個查詢條件必須都滿足。
should:文檔應該匹配should所包括的查詢條件其中的一個或多個,相當于 "OR" 。表示或者,多個查詢條件只要有一個滿足即可。
must_not:文檔不能匹配must_not所包括的該查詢條件,相當于 “NOT”。表示非。
boolQueryBuilder.must(multiMatchQueryBuilder);?
七、filter過濾器
boolQueryBuilder.filter(QueryBuilders.termQuery("studymodel", "201001"));?
boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(60).lte(100));?
八、sort排序
searchSourceBuilder.sort(new FieldSortBuilder("price").order(SortOrder.ASC));?
九、高亮顯示
//高亮設置
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<tag>");//設置前綴
highlightBuilder.postTags("</tag>");//設置后綴
// 設置高亮字段
highlightBuilder.fields().add(new HighlightBuilder.Field("name"));
//取出高亮字段內容
HighlightField nameField = highlightFields.get("name");
Text[] fragments = nameField.getFragments();