Elasticsearch簡介


  疫情已經持續了好幾個月了,作為程序員滴我們也幫不上什么忙,只有老老實實呆在家里或者出門一定戴口罩准守一些規則,不給國家添亂。不過最近疫情開始有所扭轉,但是還是對國家經濟,對企業業務造成了很大的影響,我也被停止了實習。接下來,可能會面臨着失業,破產等等嚴肅的問題。但是我們還是需要繼續學習,提高自己的競爭力,才能在疫情過后,有自己的一席之地,可以在合適自己的地方發揮自己的作用。中國加油,武漢加油。

全文檢索Elasticsearch

1. 相關特點:

  • 分布式,無需人工搭建集群(solr需要人為配置,使用zookeeper作為注冊中心)
  • Restful風格,一切API都遵循Rest原則,容易上手
  • 實時搜索,數據更新在ElasticSearch中幾乎是完全同步的。

2. 操作索引

  1. 基本概念:Elasticsearch是基於Lucene的全文檢索庫,本質也是存儲數據,很多概念與MySql類似的。
  2. // 對比關系
    索引集(indices)------------------------------------------------Databases 數據庫 類型(type)---------------------------------------------Table 數據表 文檔(Document)-----------------------------Row 行 字段(Field)----------------------Columns列

     

  3. 相關解釋:
    • 類型(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"
        					}
        				}
        			}
        		}
        	}
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM