疫情已經持續了好幾個月了,作為程式員滴我們也幫不上什麼忙,只有老老實實呆在家裡或者出門一定戴口罩準守一些規則,不給國家添亂。不過最近疫情開始有所扭轉,但是還是對國家經濟,對企業業務造成了很大的影響,我也被停止了實習。接下來,可能會面臨著失業,破產等等嚴肅的問題。但是我們還是需要繼續學習,提高自己的競 ...
疫情已經持續了好幾個月了,作為程式員滴我們也幫不上什麼忙,只有老老實實呆在家裡或者出門一定戴口罩準守一些規則,不給國家添亂。不過最近疫情開始有所扭轉,但是還是對國家經濟,對企業業務造成了很大的影響,我也被停止了實習。接下來,可能會面臨著失業,破產等等嚴肅的問題。但是我們還是需要繼續學習,提高自己的競爭力,才能在疫情過後,有自己的一席之地,可以在合適自己的地方發揮自己的作用。中國加油,武漢加油。
全文檢索Elasticsearch
1. 相關特點:
- 分散式,無需人工搭建集群(solr需要人為配置,使用zookeeper作為註冊中心)
- Restful風格,一切API都遵循Rest原則,容易上手
- 近實時搜索,數據更新在ElasticSearch中幾乎是完全同步的。
2. 操作索引
- 基本概念:Elasticsearch是基於Lucene的全文檢索庫,本質也是存儲數據,很多概念與MySql類似的。
-
// 對比關係
索引集(indices)------------------------------------------------Databases 資料庫 類型(type)---------------------------------------------Table 數據表 文檔(Document)-----------------------------Row 行 欄位(Field)----------------------Columns列 - 相關解釋:
-
- 類型(type):一個索引庫下可以有不同類型的索引,比如商品類型、訂單類型,其數據格式不同。不過這回導致索引庫混亂,因此未來版本會移除這個概念。
- 映射配置(mappings):欄位的數據類型、屬性、是否索引、是否存儲等特性。
- 分片(shard):數據拆分後的各個部分。
- 副本(replica):每個分片的複製。
-
註意:Elasticsearch本身就是分散式的,因此即使你只有一個節點,Elasticsearch預設也會對你的數據進行分片和副本操作,當你向集群添加數據時,數據也會在新加入的節點中進行平衡。
a、創建索引:
- 請求方式:PUT
- 請求路徑:ip地址:埠號/索引庫名(下文相關 HTTP請求路徑 省略)
- 請求參數:json格式
- 例子:
{ // settings: 索引庫的設置。 "settings": { "number_of_shards": 3, // 分片數量 "number_of_replicas": 2 // 副本數量 } }
b、刪除索引
- 請求方式:DELETE
- 請求路徑:/索引庫名
c、查詢索引
- 請求方式:GET
- 請求路徑:/索引庫名
d、創建映射欄位
- 請求方式:PUT
- 請求路徑:/索引庫名/_mapping/類型名稱
- 請求參數:json格式
- 例子:
{ "properties": { "欄位名": { "type": "類型", "index": true, "store": true, "analyzer": "分詞器" // 分詞器 } } }
- 例子:
- 相關解釋
- 類型名稱:就是type的概念,類似於資料庫中的不同表
- 欄位名:任意寫,可以指定許多屬性,例如
- type類型,可以是String類型(text【可分詞】、keyword【不可分詞】)、long、short、date、integer、object等。
-
註意:如果存的是對象,比如:{girl: {name:"rose",age:21}} 會被處理成兩個欄位:girl.name和girl.age
-
- index:是否索引,預設為true。如果索引,則可以用來搜索。
- store:是否存儲,預設為false。在Elasticsearch中,即便store設為false,也可以搜索到結果(原因:Elasticsearch在創建文檔搜索時,會將文檔中的原始數據備份,保存到一個叫做_source的屬性中。而且我們可以通過過濾_source來選擇那些需要顯示,那些不顯示。
3. 新增數據
- 隨機生成id
- 請求方式:POST
- 請求路徑:/索引庫名/類型名稱
- 請求參數: { "key": "value" }
- 自定義id
-
POST /索引庫名/類型名稱/id值 { ... }
- 智能判斷:
- solr:新增數據時,只能使用提前配置好映射屬性的欄位,否則會報錯。
- Elasticsearch:不需要給索引庫設置任何mapping映射,它也可以根據你輸入的數據來判斷類型,動態添加數據映射。(如果存儲的是String類型數據,ES無智能判斷,它會存入兩個欄位。例如:存入一個name欄位,智能形成兩個欄位 name: text類型 name.keyword: keyword類型)
4. 修改數據:
- 請求方式: PUT
- 請求路徑:/索引庫名/類型名稱/id值
- 註意:修改必須指定id。id對應的文檔存在,則修改;id對應文檔不存在,則新增。
5. 查詢
- 基本查詢:
GET /索引庫名/_search { "query": { "查詢類型": { "查詢條件":"查詢條件值" } } } 例子: GET /article/_search { "query": { "match": { "title": { "query": "廣州上海", "operator":"and" } } } }
- 查詢類型:
- 查詢所有(match_all)【全文檢索】
- 多欄位查詢(multi_match)
-
GET /索引庫名/_search { "query": { "multi_match": { "query": "查詢內容", "fields": ["查詢欄位1","查詢欄位2"] } } }
- 詞條匹配(term):查詢被用於精確值匹配,這些精確值可能是數字、時間、布爾或者那些未分詞的字元串。推薦除了text以外的類型用term,減少分詞帶來的消耗,例
GET /索引庫名/_search { "query": { "term": { "查詢欄位":"查詢內容" } } }
- 結果過濾:{ "_source" : [ "過濾欄位1" , "過濾欄位2" ] }。
{ "_source": { # "includes": "過濾欄位" # 和上面作用一樣 "excludes":"排除過濾欄位" } }
- 查詢類型:
- 高級查詢
- 模糊查詢(fuzzy)
- 範圍查詢(range)
GET /索引庫名/_search { "query": { "range": { "查詢欄位": { "gte": 數值, # 大於,可省略 "lte": 數值 # 小於,可省略 } } } }
- 布爾查詢和過濾
GET /索引庫名/_search { "query": { "bool": { "must": [ {"match": { "查詢欄位": "查詢內容" }} ], "filter": { "range": { "過濾欄位": { "gte": 數值 } } } } } }
- 排序
"sort": [ { "排序欄位": { "order": "desc" # 降序排序 } } ]
- 分頁: "from" : 數值 "size" : 數值
6. 聚合aggregations:實現對數據的統計、分析
- 基本概念:包括多種類型,最常見的兩種,一個叫 桶(bucket),一個叫 度量(metrics)
- 桶:作用:是按照某種方式對數據進行分組,每一組數據在es中稱為一個桶(組)。
- Terms Aggregation:根據詞條內容分組,詞條內容完全匹配的為一組
- Range Aggregation:數值和日期的範圍分組,指定開始和結束,然後按段分組
- Histogram Aggregation:根據數值階梯(Inteval)分組
- Date Aggregation:根據日期階梯分組,例如:給定階梯為周,會自動每周分為一組
-
GET /索引庫名/_search { "aggs": { "桶分組名稱": { "桶分組方式": { "field": "分桶欄位" } } } }
- 度量:分組完以後,一般會對組中的數據進行聚合運算,例如:求平均值、最大、最小、求和等,這些在es中稱為度量
- Avg Aggregation:求平均值
- Max Aggregation:求最大值
- Min Aggregation:求最小值
- Percentiles Aggregation:求百分比
- Stats Aggregation:同時返回avg、max、min、sum、count等
- Sum Aggregation:求和
- Top hits Aggregation:求前幾
- Value Count Aggregation:求總數
-
GET /索引庫名/_search { "aggs": { "度量名稱": { "度量運算": { "field": "運算欄位" } } } } 例子:{ "size": 0, "aggs": { "popular_brand": { "terms": { "field": "make" }, "aggs": { "price_avg": { "avg": { "field": "price" } } } } } }
- 桶:作用:是按照某種方式對數據進行分組,每一組數據在es中稱為一個桶(組)。