演示使用的數據:
```json
#創建student索引
PUT /student
#添加下面數據用于演示
POST /student/_doc/1001
{
"name": "zhangsan",
"nickname": "zhangsan",
"sex": "男",
"age": 30
}
POST /student/_doc/1002
{
"name": "lisi",
"nickname": "lisi",
"sex": "男",
"age": 20
}
POST /student/_doc/1003
{
"name": "wangwu",
"nickname": "wangwu",
"sex": "女",
"age": 40
}
POST /student/_doc/1004
{
"name": "zhangsan01",
"nickname": "zhangsan01",
"sex": "女",
"age": 50
}
POST /student/_doc/1005
{
"name": "zhangsan02",
"nickname": "zhangsan02",
"sex": "女",
"age": 30
}
```
**1. 查詢一個索引的所有文檔**
```json
#寫法1
GET /student/_search
#寫法2
GET /student/_search
{
"query": {
"match_all": {}
}
}
```
結果如下:
```json
{
"took" : 0, #查詢花銷的時間
"timed_out" : false, #是否超時,false-不超時
"_shards" : { #分片信息
"total" : 1, #分片總數
"successful" : 1, #分片成功次數
"skipped" : 0, #分片被忽略次數
"failed" : 0 #分片失敗次數
},
"hits" : { #搜索命中結果
"total" : { #搜索條件匹配文檔總數
"value" : 5, #條件命中條數
"relation" : "eq" #計數規則,eq-計數準確、gte-計數不準確
},
"max_score" : 1.0, #匹配度分值
"hits" : [ #命中結果集合
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1001",
"_score" : 1.0,
"_source" : {
"name" : "zhangsan",
"nickname" : "zhangsan",
"sex" : "男",
"age" : 30
}
},
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1002",
"_score" : 1.0,
"_source" : {
"name" : "lisi",
"nickname" : "lisi",
"sex" : "男",
"age" : 20
}
},
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1003",
"_score" : 1.0,
"_source" : {
"name" : "wangwu",
"nickname" : "wangwu",
"sex" : "女",
"age" : 40
}
},
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1004",
"_score" : 1.0,
"_source" : {
"name" : "zhangsan01",
"nickname" : "zhangsan01",
"sex" : "女",
"age" : 50
}
},
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1005",
"_score" : 1.0,
"_source" : {
"name" : "zhangsan02",
"nickname" : "zhangsan02",
"sex" : "女",
"age" : 30
}
}
]
}
}
```
**2. 匹配查詢**
`match` 匹配類型查詢,會把查詢條件進行分詞,然后進行查詢,多個詞條之間是 or 的關系。
```json
#寫法1
GET /student/_search?q=name:zhangsan
#寫法2
GET /student/_search
{
"query": {
"match": {
"name": "zhangsan"
}
}
}
```
結果如下:
```json
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.3862942,
"hits" : [
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1001",
"_score" : 1.3862942,
"_source" : {
"name" : "zhangsan",
"nickname" : "zhangsan",
"sex" : "男",
"age" : 30
}
}
]
}
}
```
**3. 字段匹配查詢**
`multi_match` 與 `match` 類似,不同的是它可以在多個字段中查詢,多個字段是 OR 關系。
```json
GET /student/_search
{
"query": {
"multi_match": {
"query": "zhangsan",
"fields": ["name", "nickname"] #name=zhangsan 或者 nickname=zhangsan
}
}
}
```
結果如下:
```json
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.540445,
"hits" : [
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1001",
"_score" : 1.540445,
"_source" : {
"name" : "zhangsan",
"nickname" : "zhangsan",
"sex" : "男",
"age" : 30
}
}
]
}
}
```
**4. 關鍵字精準查詢**
`term` 查詢,精確的關鍵詞匹配查詢,不對查詢條件進行分詞。
```json
GET /student/_search
{
"query": {
"term": {
"name": {
"value": "zhangsan"
}
}
}
}
```
結果如下:
```json
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.3862942,
"hits" : [
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1001",
"_score" : 1.3862942,
"_source" : {
"name" : "zhangsan",
"nickname" : "zhangsan",
"sex" : "男",
"age" : 30
}
}
]
}
}
```
**5. 多關鍵字精確查詢**
`terms` 查詢和 `term` 查詢一樣,但它允許你指定多值進行匹配。
```json
GET /student/_search
{
"query": {
"terms": {
"name": ["zhangsan", "lisi"] #name=zhangsan 或者name=lisi
}
}
}
```
解決如下:
```json
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1001",
"_score" : 1.0,
"_source" : {
"name" : "zhangsan",
"nickname" : "zhangsan",
"sex" : "男",
"age" : 30
}
},
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1002",
"_score" : 1.0,
"_source" : {
"name" : "lisi",
"nickname" : "lisi",
"sex" : "男",
"age" : 20
}
}
]
}
}
```
**6. 只查詢指定字段**
默認情況下,Elasticsearch 在搜索的結果中,會把文檔中保存在`_source` 的所有字段都返回。
如果我們只想獲取其中的部分字段,我們可以添加`_source` 的過濾。
```json
#寫法1
GET /student/_search?q=nickname:zhangsan&_source=name,nickname
#寫法2
GET /student/_search
{
"_source": ["name", "nickname"], #只查詢name和nickname字段
"query": {
"terms": {
"nickname": ["zhangsan"] #條件是nickname=zhangsan
}
}
}
```
結果如下:
```json
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.3862942,
"hits" : [
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1001",
"_score" : 1.3862942,
"_source" : {
"name" : "zhangsan",
"nickname" : "zhangsan"
}
}
]
}
}
```
**7. 過濾字段**
`includes`:來指定想要顯示的字段。
`excludes`:來指定不想要顯示的字段。
(1)只查詢`includes`指定的字段。
```json
GET /student/_search
{
"_source": {
"includes": ["name", "nickname"] #只查詢name、nickname字段
},
"query": {
"terms": {
"nickname": ["zhangsan", "lisi"] #條件是nickname=zhangsan 或者niciname=lisi
}
}
}
```
結果如下:
```json
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1001",
"_score" : 1.0,
"_source" : {
"name" : "zhangsan",
"nickname" : "zhangsan"
}
},
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1002",
"_score" : 1.0,
"_source" : {
"name" : "lisi",
"nickname" : "lisi"
}
}
]
}
}
```
(2)除了`excludes`指定的字段不查詢,其他字段都查詢。
```json
GET /student/_search
{
"_source": {
"excludes": ["name", "nickname"] #不查詢name、nickname字段
},
"query": {
"terms": {
"nickname": ["zhangsan", "lisi"] #條件是nickname=zhangsan 或者nickname=lisi
}
}
}
```
結果如下:
```json
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1001",
"_score" : 1.0,
"_source" : {
"sex" : "男",
"age" : 30
}
},
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1002",
"_score" : 1.0,
"_source" : {
"sex" : "男",
"age" : 20
}
}
]
}
}
```
**8. 組合查詢**
`bool`把各種其它查詢通過`must`(必須 )、`must_not`(必須不)、`should`(應該)的方式進行組合。
```json
GET /student/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "zhangsan"
}
}
],
"must_not": [
{
"match": {
"age": 40
}
}
],
"should": [
{
"match": {
"sex": "男"
}
}
]
}
}
}
```
結果如下:
```json
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 2.261763,
"hits" : [
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1001",
"_score" : 2.261763,
"_source" : {
"name" : "zhangsan",
"nickname" : "zhangsan",
"sex" : "男",
"age" : 30
}
}
]
}
}
```
**9. 范圍查詢**
`range` 查詢找出那些落在指定區間內的數字或者時間。`range` 查詢允許以下字符。
```
gt 大于(>)
gte 大于等于(>=)
lt 小于(<)
lte 小于等于(<=)
```
```json
#查詢age在[30, 35]區間的文檔
GET /student/_search?q=age[30 TO 35]
#查詢age>=30的文檔
GET /student/_search?q=age:>=40
#查詢age在[30, 35]區間的文檔
GET /student/_search
{
"query": {
"range": {
"age": {
"gte": 30,
"lte": 35
}
}
}
}
```
查詢age在[30, 35]區間結果如下:
```json
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1001",
"_score" : 1.0,
"_source" : {
"name" : "zhangsan",
"nickname" : "zhangsan",
"sex" : "男",
"age" : 30
}
},
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1005",
"_score" : 1.0,
"_source" : {
"name" : "zhangsan02",
"nickname" : "zhangsan02",
"sex" : "女",
"age" : 30
}
}
]
}
}
```
**10. 模糊查詢**
返回包含與搜索字詞相似的字詞的文檔。
編輯距離是將一個術語轉換為另一個術語所需的一個字符更改的次數。這些更改可以包括:
* 更改字符(box → fox)
* 刪除字符(black → lack)
* 插入字符(sic → sick)
* 轉置兩個相鄰字符(act → cat)
為了找到相似的術語,`fuzzy` 查詢會在指定的編輯距離內創建一組搜索詞的所有可能的變體或擴展。然后查詢返回每個擴展的完全匹配。
通過 `fuzziness` 修改編輯距離。一般使用默認值 AUTO,根據術語的長度生成編輯距離。
```json
GET /student/_search
{
"query": {
"fuzzy": {
"name": {
"value": "zhangsan"
}
}
}
}
GET /student/_search
{
"query": {
"fuzzy": {
"name": {
"value": "zhangsan"
, "fuzziness": 1
}
}
}
}
```
結果如下 :
```json
#########不指定編輯距離fuzziness的結果#########
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.3862942,
"hits" : [
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1001",
"_score" : 1.3862942,
"_source" : {
"name" : "zhangsan",
"nickname" : "zhangsan",
"sex" : "男",
"age" : 30
}
},
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1004",
"_score" : 1.0397208,
"_source" : {
"name" : "zhangsan01",
"nickname" : "zhangsan01",
"sex" : "女",
"age" : 50
}
},
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1005",
"_score" : 1.0397208,
"_source" : {
"name" : "zhangsan02",
"nickname" : "zhangsan02",
"sex" : "女",
"age" : 30
}
}
]
}
}
#########指定編輯距離fuzziness為1的結果#########
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.3862942,
"hits" : [
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1001",
"_score" : 1.3862942,
"_source" : {
"name" : "zhangsan",
"nickname" : "zhangsan",
"sex" : "男",
"age" : 30
}
}
]
}
}
```
**11. 字段排序**
```json
#先根據age降序排序,再根據_score字段降序排序
GET /student/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": {
"order": "desc" #desc是降序,asc是升序
}
},
{
"_score": {
"order": "desc"
}
}
]
}
```
結果如下:
```json
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 5,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1004",
"_score" : 1.0,
"_source" : {
"name" : "zhangsan01",
"nickname" : "zhangsan01",
"sex" : "女",
"age" : 50
},
"sort" : [
50,
1.0
]
},
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1003",
"_score" : 1.0,
"_source" : {
"name" : "wangwu",
"nickname" : "wangwu",
"sex" : "女",
"age" : 40
},
"sort" : [
40,
1.0
]
},
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1001",
"_score" : 1.0,
"_source" : {
"name" : "zhangsan",
"nickname" : "zhangsan",
"sex" : "男",
"age" : 30
},
"sort" : [
30,
1.0
]
},
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1005",
"_score" : 1.0,
"_source" : {
"name" : "zhangsan02",
"nickname" : "zhangsan02",
"sex" : "女",
"age" : 30
},
"sort" : [
30,
1.0
]
},
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1002",
"_score" : 1.0,
"_source" : {
"name" : "lisi",
"nickname" : "lisi",
"sex" : "男",
"age" : 20
},
"sort" : [
20,
1.0
]
}
]
}
}
```
**12. 高亮查詢**
高亮查詢由`highlight`屬性提供,它由下面幾個標簽組合完成高亮查詢。
```
pre_tags:前置標簽
post_tags:后置標簽
fields:需要高亮的字段
title:這里聲明 title 字段需要高亮,后面可以為這個字段設置特有配置,也可以空
```
```json
GET /student/_search
{
"query": {
"match": {
"name": "zhangsan" #在這里指定name,則只有name字段可以高亮顯示
}
},
"highlight": {
"pre_tags": "<font color='red'>",
"post_tags": "</font>",
"fields": {
"name": {}
}
}
}
```
結果如下:
```json
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.3862942,
"hits" : [
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1001",
"_score" : 1.3862942,
"_source" : {
"name" : "zhangsan",
"nickname" : "zhangsan",
"sex" : "男",
"age" : 30
},
"highlight" : {
"name" : [
"<font color='red'>zhangsan</font>"
]
}
}
]
}
}
```
返回json數據看不出高亮效果,我用Postman查詢結果如下:

**13. 分頁查詢**
`from`:當前頁的起始索引,默認從 0 開始。 `$ from = (pageNum - 1) * size $`,pageNum為當前第幾頁。
`size`:每頁顯示多少條。
```json
GET /student/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": {
"order": "desc"
}
}
],
"from": 0,
"size": 2
}
```
結果如下:
```json
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 5,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1004",
"_score" : null,
"_source" : {
"name" : "zhangsan01",
"nickname" : "zhangsan01",
"sex" : "女",
"age" : 50
},
"sort" : [
50
]
},
{
"_index" : "student",
"_type" : "_doc",
"_id" : "1003",
"_score" : null,
"_source" : {
"name" : "wangwu",
"nickname" : "wangwu",
"sex" : "女",
"age" : 40
},
"sort" : [
40
]
}
]
}
}
```
**14. 聚合查詢**
聚合允許使用者對 es 文檔進行統計分析,類似與關系型數據庫中的 group by,當然還有很
多其他的聚合,例如取最大值、平均值等等。
(1)求最大值、最小值等。
```json
GET /student/_search
{
"aggs": {
"max_age": { #max_age是別名,自由定義即可
"max": { #對age字段求最大值
"field": "age"
}
}
},
"size": 0
}
GET /student/_search
{
"aggs": {
"min_age": {
"min": {"field": "age"} #對age字段求最小值
}
},
"size": 0
}
GET /student/_search
{
"aggs": {
"sum_age": {
"sum": {"field": "age"} #對age字段求和
}
},
"size": 0
}
GET /student/_search
{
"aggs": {
"avg_age": {
"avg": {"field": "age"} #對age字段求平均值
}
},
"size": 0
}
GET /student/_search
{
"aggs": {
"distinct_age": {
"cardinality": {"field": "age"} #對age字段的值進行去重之后再取總數
}
},
"size": 0
}
```
結果我這里就不寫出來了。
(2)`state`聚合。對某個字段一次性返回 count,max,min,avg 和 sum 五個指標
```json
GET /student/_search
{
"aggs": {
"stats_age": {
"stats": {"field": "age"}
}
},
"size": 0
}
```
結果如下:
```json
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 5,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"stats_age" : {
"count" : 5,
"min" : 20.0,
"max" : 50.0,
"avg" : 34.0,
"sum" : 170.0
}
}
}
```
**15. 桶聚合查詢**
桶聚和相當于 sql 中的 group by 語句。
(1)分組。
```json
GET /student/_search
{
"aggs": {
"age_groupby": {
"terms": {"field": "age"}
}
},
"size": 0
}
```
結果如下:
```json
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 5,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"age_groupby" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : 30,
"doc_count" : 2 #30歲這一組的人數有兩個
},
{
"key" : 20,
"doc_count" : 1
},
{
"key" : 40,
"doc_count" : 1
},
{
"key" : 50,
"doc_count" : 1
}
]
}
}
}
```
(2)分組聚合。
```json
#先分組,再對每一個組求和
GET /student/_search
{
"aggs": {
"age_groupby": {
"terms": {"field": "age"},
"aggs": {
"sum_age": {
"sum": {"field": "age"}
}
}
}
},
"size": 0
}
```
結果如下:
```json
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 5,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"age_groupby" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : 30,
"doc_count" : 2,
"sum_age" : {
"value" : 60.0 #30歲這一組的求和結果為60
}
},
{
"key" : 20,
"doc_count" : 1,
"sum_age" : {
"value" : 20.0
}
},
{
"key" : 40,
"doc_count" : 1,
"sum_age" : {
"value" : 40.0
}
},
{
"key" : 50,
"doc_count" : 1,
"sum_age" : {
"value" : 50.0
}
}
]
}
}
}
```
- 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
- 環境搭建
- 索引操作
- 文檔操作