**1. 查詢一個索引的所有文檔**
```java
/**
* 查詢一個索引的所有文檔
*/
@Test
public void matchAllQuery() throws IOException {
//獲取客戶端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
SearchRequest request = new SearchRequest();
//設置要查詢的索引
request.indices("student");
//構建SearchSourceBuilder
SearchSourceBuilder builder = new SearchSourceBuilder();
//查詢所有數據
builder.query(QueryBuilders.matchAllQuery());
request.source(builder);
//發送請求并獲取響應
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits()) {
log.info(hit.getSourceAsString());
}
//{"name":"zhangsan","nickname":"zhangsan","sex":"男","age":30}
//{"name":"lisi","nickname":"lisi","sex":"男","age":20}
//{"name":"wangwu","nickname":"wangwu","sex":"女","age":40}
//{"name":"zhangsan01","nickname":"zhangsan01","sex":"女","age":50}
//{"name":"zhangsan02","nickname":"zhangsan02","sex":"女","age":30}
client.close(); //關閉連接
}
```
**2. 關鍵字精準查詢**
```java
/**
* 關鍵字精準查詢。
* term 查詢,精確的關鍵詞匹配查詢,不對查詢條件進行分詞。
*/
@Test
public void termQuery() throws IOException {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
SearchRequest request = new SearchRequest();
//設置要查詢的索引
request.indices("student");
//SearchSourceBuilder
SearchSourceBuilder builder = new SearchSourceBuilder();
//查詢條件:age=30
builder.query(QueryBuilders.termQuery("age", "30"));
request.source(builder);
//發送請求并獲取響應
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits()) {
log.info(hit.getSourceAsString());
}
//{"name":"zhangsan","nickname":"zhangsan","sex":"男","age":30}
//{"name":"zhangsan02","nickname":"zhangsan02","sex":"女","age":30}
client.close(); //關閉連接
}
```
**3. 分頁查詢**
```java
/**
* 分頁查詢
*/
@Test
public void pageQuery() throws IOException {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
SearchRequest request = new SearchRequest();
//設置要查詢的索引
request.indices("student");
//構建SearchSourceBuilder
SearchSourceBuilder builder = new SearchSourceBuilder();
//查詢所有文檔
builder.query(QueryBuilders.matchAllQuery());
//構建分頁查詢
//從第1頁開始(第一頁默認從0開始), from=(pageNum?1)?size, pageNum為當前第幾頁
builder.from(0);
//每頁顯示2條數據
builder.size(2);
request.source(builder);
//發送請求并獲取響應
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits()) {
log.info(hit.getSourceAsString());
}
//{"name":"zhangsan","nickname":"zhangsan","sex":"男","age":30}
//{"name":"lisi","nickname":"lisi","sex":"男","age":20}
client.close();
}
```
**4. 排序**
```java
/**
* 排序
*/
@Test
public void orderQuery() throws IOException {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//構建查詢request
SearchRequest request = new SearchRequest();
//設置要查詢的索引
request.indices("student");
//構建查詢體
SearchSourceBuilder builder = new SearchSourceBuilder();
//查詢所有
builder.query(QueryBuilders.matchAllQuery());
//排序,升序排序
builder.sort("age", SortOrder.ASC);
request.source(builder);
//發送請求并獲取響應
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits()) {
log.info(hit.getSourceAsString());
}
//{"name":"lisi","nickname":"lisi","sex":"男","age":20}
//{"name":"zhangsan","nickname":"zhangsan","sex":"男","age":30}
//{"name":"zhangsan02","nickname":"zhangsan02","sex":"女","age":30}
//{"name":"wangwu","nickname":"wangwu","sex":"女","age":40}
//{"name":"zhangsan01","nickname":"zhangsan01","sex":"女","age":50}
client.close();
}
```
**5. 過濾字段**
```java
/**
* 過濾字段
*/
@Test
public void filterQuery() throws IOException {
//獲取客戶端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//構建查詢request
SearchRequest request = new SearchRequest();
//設置要查詢的索引
request.indices("student");
//構建查詢體
SearchSourceBuilder builder = new SearchSourceBuilder();
//查詢條件:查詢所有
builder.query(QueryBuilders.matchAllQuery());
//查詢過濾字段
String[] excludes = {}; //不查詢的字段
String[] includes = {"name", "age"}; //只查詢的字段
builder.fetchSource(includes, excludes);
request.source(builder);
//發送請求并獲取響應
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits()) {
log.info(hit.getSourceAsString());
}
//{"name":"zhangsan","age":30}
//{"name":"lisi","age":20}
//{"name":"wangwu","age":40}
//{"name":"zhangsan01","age":50}
//{"name":"zhangsan02","age":30}
client.close();
}
```
**6. 組合查詢**
```java
/**
* 組合查詢
* bool把各種其它查詢通過must(必須 )、must_not(必須不)、should(應該)的方式進行組合。
*/
@Test
public void boolQuery() throws IOException {
//獲取客戶端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//構建搜索請求對象
SearchRequest request = new SearchRequest();
//設置要查詢的索引
request.indices("student");
//構建查詢體
SearchSourceBuilder builder = new SearchSourceBuilder();
//構建bool查詢體
BoolQueryBuilder boolBuilder = new BoolQueryBuilder();
//條件1:必須age=30
boolBuilder.must(QueryBuilders.matchQuery("age", "30"));
//條件2:必須name!=zhangsan
boolBuilder.mustNot(QueryBuilders.matchQuery("name", "zhangsan"));
//條件3:應該sex=男
boolBuilder.should(QueryBuilders.matchQuery("sex", "男"));
builder.query(boolBuilder);
request.source(builder);
//發送請求并獲取響應
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits()) {
log.info(hit.getSourceAsString());
}
//{"name":"zhangsan02","nickname":"zhangsan02","sex":"女","age":30}
}
```
**7. 范圍查詢**
```java
/**
* 范圍查詢
* gt 大于(>)
* gte 大于等于(>=)
* lt 小于(<)
* lte 小于等于(<=)
*/
@Test
public void rangeQuery() throws IOException {
//獲取客戶端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//構建搜索請求對象
SearchRequest request = new SearchRequest();
//設置要查詢的索引
request.indices("student");
//構建查詢體
SearchSourceBuilder builder = new SearchSourceBuilder();
//構建范圍查詢體
RangeQueryBuilder rangeBuilder = QueryBuilders.rangeQuery("age");
rangeBuilder.gte("30"); //age大于等于30
rangeBuilder.lte("40"); //age小于等于40
builder.query(rangeBuilder);
request.source(builder);
//發送請求并獲取響應
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits()) {
log.info(hit.getSourceAsString());
}
//{"name":"zhangsan","nickname":"zhangsan","sex":"男","age":30}
//{"name":"wangwu","nickname":"wangwu","sex":"女","age":40}
//{"name":"zhangsan02","nickname":"zhangsan02","sex":"女","age":30}
}
```
**8. 模糊查詢**
```java
/**
* 模糊查詢:返回包含與搜索字詞相似的字詞的文檔。
* 1)編輯距離是將一個術語轉換為另一個術語所需的一個字符更改的次數。這些更改可以包括:
* * 1、更改字符(box → fox)
* * 2、刪除字符(black → lack)
* * 3、插入字符(sic → sick)
* * 4、轉置兩個相鄰字符(act → cat)
* 為了找到相似的術語,`fuzzy` 查詢會在指定的編輯距離內創建一組搜索詞的所有可能的變體或擴展。然后查詢返回每個擴展的完全匹配。
* 通過 `fuzziness` 修改編輯距離。一般使用默認值 AUTO,根據術語的長度生成編輯距離。
*/
@Test
public void fuzzyQuery() throws IOException {
//獲取客戶端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//構建搜索請求對象
SearchRequest request = new SearchRequest();
//設置要查詢的索引
request.indices("student");
//構建查詢體
SearchSourceBuilder builder = new SearchSourceBuilder();
//模糊查詢
builder.query(QueryBuilders
.fuzzyQuery("name", "zhangsan")
.fuzziness(Fuzziness.AUTO));
request.source(builder);
//發送請求并獲取響應
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits()) {
log.info(hit.getSourceAsString());
}
//{"name":"zhangsan","nickname":"zhangsan","sex":"男","age":30}
//{"name":"zhangsan01","nickname":"zhangsan01","sex":"女","age":50}
//{"name":"zhangsan02","nickname":"zhangsan02","sex":"女","age":30}
}
```
**9. 高亮查詢**
```java
/**
* 高亮查詢
*/
@Test
public void highlightQuery() throws IOException {
//獲取客戶端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
SearchRequest request = new SearchRequest();
//設置要查詢的索引
request.indices("student");
//構建SearchSourceBuilder
SearchSourceBuilder builder = new SearchSourceBuilder();
//查詢name=zhangsan
TermsQueryBuilder termsBuilder = QueryBuilders.termsQuery("name", "zhangsan");
builder.query(termsBuilder);
//構建高亮字段
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<font color='red'>"); //前置標簽
highlightBuilder.postTags("</font>"); //后置標簽
highlightBuilder.field("name"); //要高亮的字段
builder.highlighter(highlightBuilder);
request.source(builder);
//發送請求并獲取響應
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits()) {
log.info(hit.getSourceAsString());
Map<String, HighlightField> highlightFieldMap = hit.getHighlightFields();
log.info("高亮結果:{}", highlightFieldMap);
}
//{"name":"zhangsan","nickname":"zhangsan","sex":"男","age":30}
//高亮結果:{name=[name], fragments[[<font color='red'>zhangsan</font>]]}
}
```
**10. 聚合查詢**
```java
/**
* 聚合查詢
*/
@Test
public void aggsQuery() throws IOException {
//獲取客戶端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
SearchRequest request = new SearchRequest();
//設置要查詢的索引
request.indices("student");
SearchSourceBuilder builder = new SearchSourceBuilder();
//求最大值
//searchSourceBuilder.aggregation(AggregationBuilders.max("max_age").field("age"));
//最小值
//searchSourceBuilder.aggregation(AggregationBuilders.min("min_age").field("age"));
//stats可以一次性將max/min/avg/count/sum求出
builder.aggregation(AggregationBuilders.stats("stats_age").field("age"));
request.source(builder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//...,"aggregations":{"stats#stats_age":{"count":5,"min":20.0,"max":50.0,"avg":34.0,"sum":170.0}}}
log.info("{}", response);
client.close();
}
```
**11. 分組統計**
```java
/**
* 分組統計
*/
@Test
public void groupbyQuery() throws IOException {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http")));
SearchRequest request = new SearchRequest();
request.indices("student"); //設置要搜索的索引
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.aggregation(AggregationBuilders.terms("age_groupby").field("age"));
request.source(builder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//...
// {"key":30,"doc_count":2},
// {"key":20,"doc_count":1},
// {"key":40,"doc_count":1},
// {"key":50,"doc_count":1}]}}}
log.info("{}", response);
}
```
- Elasticsearch是什么
- 全文搜索引擎
- Elasticsearch與Solr
- 數據結構
- 安裝Elasticsearch
- Linux單機安裝
- Windows單機安裝
- 安裝Kibana
- Linux安裝
- Windows安裝
- es基本語句
- 索引操作
- 文檔操作
- 映射操作
- 高級查詢
- es-JavaAPI
- maven依賴
- 索引操作
- 文檔操作
- 高級查詢
- es集群搭建
- Linux集群搭建
- Windows集群搭建
- 核心概念
- 索引(Index)
- 類型(Type)
- 文檔(Document)
- 字段(Field)
- 映射(Mapping)
- 分片(Shards)
- 副本(Replicas)
- 分配(Allocation)
- 系統架構
- 分布式集群
- 單節點集群
- 故障轉移
- 水平擴容
- 應對故障
- 路由計算
- 分片控制
- 寫流程
- 讀流程
- 更新流程
- 多文檔操作流程
- 分片原理
- 倒排索引
- 文檔搜索
- 動態更新索引
- 近實時搜索
- 持久化變更
- 段合并
- 文檔分析
- 內置分析器
- 分析器使用場景
- 測試分析器
- 指定分析器
- 自定義分析器
- 文檔處理
- 文檔沖突
- 樂觀并發控制
- 外部系統版本控制
- es優化
- 硬件選擇
- 分片策略
- 合理設置分片數
- 推遲分片分配
- 路由選擇
- 寫入速度優化
- 批量數據提交
- 優化存儲設備
- 合理使用合并
- 減少Refresh的次數
- 加大Flush設置
- 減少副本的數量
- 內存設置
- 重要配置
- es常見問題
- 為什么要使用Elasticsearch
- master選舉流程
- 集群腦裂問題
- 索引文檔流程
- 更新和刪除文檔流程
- 搜索流程
- ES部署在Linux時的優化方法
- GC方面ES需要注意的點
- ES對大數據量的聚合實現
- 并發時保證讀寫一致性
- 字典樹
- ES的倒排索引
- Spring Data Elasticsearch
- 環境搭建
- 索引操作
- 文檔操作