ElastaticSearch ---- es基礎概念及命令


Elasticsearch 介紹

  • Elasticsearch 是一個高度可擴展且開源的全文檢索和分析引擎。可以快速且近實時地存儲,檢索以及分析海量數據。

Elasticsearch 應用場景:

  • 提供搜索和自動完成功能。

  • ELK(Elasticsearch/Logstash/Kibana ),Logstash收集數據或日志,Elasticsearch聚合統計分析數據,Kibana可視化。

為什么不用Mysql?

  • 為什么不用Mysql?

解答:Mysql在做模糊查詢時,使用左模糊不會走索引,會遍歷全表,速度比較慢。

Mysql數據庫並不支持分詞。

  • Elasticsearch搜索到的數據,是可以根據評分排序或過濾的。

  • Elasticsearch會對數據進行分詞,支持相關性查詢,不是完全准確的關鍵字也能搜出相關的結果

Elasticsearch底層

  • Elasticsearch是基於倒排索引的。

倒排索引(Inverted index),也常被稱為反向索引,被用來存儲在全文搜索下某個單詞在文檔中的存儲位置的映射。
它是文檔檢索系統中最常用的數據結構。通過倒排索引,可以根據單詞快速獲取包含這個單詞的文檔列表。

一、概念

  • Index(索引) :

Elastic 數據管理的頂層單位就叫做 Index(索引)。類似單個數據庫。

  • Document(文檔):

Index 里面單條的記錄稱為 Document(文檔)。許多條 Document 構成了一個 Index。

相當於關系型數據庫中的表中的一行記錄。

Document 使用 JSON 格式表示。

  • Type(類型):

Type其相當於關系型數據庫中的表。

Document 可以分組。比如weather這個Index里面,可以按城市分組(北京和上海),也可以按氣候分組。

這種分組就叫做 Type,它是虛擬的邏輯分組,用來過濾 Document。

不同的 Type 中同一個字段 應該有相似的結構(schema),舉例來說,id字段不能在這個組是字符串,在另一個組是數值。這是與關系型數據庫的表的一個區別。

Type是通過mapping定義的。mapping中主要包括字段名、字段數據類型和字段索引類型這3個方面的定義,相當於關系型數據庫中的schema。

  • Node 與 Cluster :

單個 Elastic 實例稱為一個節點(node)。一組節點構成一個集群(cluster)。

  • _shards(分片):

分片。每個索引有一個或多個分片,索引的數據被分配到各個分片上,分片有助於橫向擴展,N個分片會被盡可能平均地(rebalance)分配在不同的節點上。

水平拓展,減小單個節點的壓力,提高性能。

  • replica(副本):

故障轉移,容錯。在 shard/node 故障的情況下提供了高可用性。

二、常用請求:

三、常用命令

  • es查詢所有記錄:

使用 GET 方法,直接請求/Index/Type/_search,就會返回所有記錄。

  • es根據id查詢:

使用 GET 方法,直接請求/Index/Type/Id。

	GET 索引名稱/類型名稱/具體id

如果是在服務器中,也可以使用以下命令:

curl -XGET http://es集群ip:9200/索引名稱/類型名稱/具體id?pretty  
  • es查看所有索引:

以下的v是用來要求在結果中返回表頭的.

 GET /_cat/indices?v 
  • es新增記錄:

向指定的 /Index/Type 發送 POST 請求,就可以在 Index 里面新增一條記錄。比如,向/accounts/person發送請求,就可以新增一條人員記錄。

POST /索引名稱/類型名稱/

示例如下:

POST /accounts/person
{
  "name": "lin",
  "date": "2020-10-24",
  "order_hour": "08",
  "day": "20201024",
  "area": "廣東"
}

也可以在服務器中,直接用curl去新增數據,示例如下:

curl -XPOST http://es集群ip:9200/accounts/person -d '{"name": "lin","date": "2020-10-24","order_hour": "08","day": "20201024","area": "廣東"}'
  • es刪除記錄:
DELETE /索引名稱/類型名稱/具體的id
  • es新增索引:
PUT /book      #put /book 代表put請求,含義是添加一個索引,book是索引名
{
  "settings": {   #settings指的是設置索引,庫的屬性
    "number_of_replicas": 1     #number_of_replicas:是備份數量
    , "number_of_shards": 5     #number_of_shards:是分片數量
  }
  ,"mappings": {   #mappings是映射的含義 mappings里面包含類型也就是表的定義;
    "novel":{   #novel 是自定義的指的是類型名,相當於表名
      "properties":{    #properties 是屬性的意思;相當於里面放着表的屬性也就是列名
        "name":{      #name是表的其中一個字段;
          "type":"text",    #type是表中name這個字段的數據類型
          "analyzer":"ik_max_word",  #analyzer 表示分詞的類型;
          "index":true     #index含義是是否要被檢索到,默認是true
        },
        "author":{    	 # author是一個字段名;
          "type":"keyword",   #keyword 是這個字段的類型;
          "index":true
        },
        "price":{ 
          "type":"long",
          "index":true
        },
        "pubdate":{
          "type":"date",   #pubdate 的格式是date,日期類型;
          "index":true, 
          "format":"yyyy-MM-dd HH:mm:ss"   #format指的是日期的格式類型;
        },
        "decr":{
          "type":"text",
          "index":true
        },
        "count":{
          "type":"long",
          "index":false
        }
      }
    }
  }
}

參考資料:https://blog.csdn.net/weixin_52578409/article/details/110493719

  • es新增字段:
    格式如下:
PUT /索引名稱/_mapping/類型名稱

{
"properties": {
  "屬性名稱": {
	"type": "long"
  }
}
}

示例如下:

PUT /index_order/_mapping/type_order
{
"properties": {
  "delivery15kg": {
	"type": "long"
  }
}
}
  • 參數 pretty=true 表示以易讀的格式返回。
GET 索引名稱/_search?pretty=true
  • _search:

/_search:所有索引,所有type下的所有數據都搜索出來;

/index1/_search:指定一個index,搜索其下所有type的數據;

/index1,index2/_search:同時搜索兩個index下的數據;

/1,2/_search:按照通配符去匹配多個索引;

/index1/type1/_search:搜索一個index下指定的type的數據;

/index1/type1,type2/_search:可以搜索一個index下多個type的數據;

/index1,index2/type1,type2/_search:搜索多個index下的多個type的數據;

/_all/type1,type2/_search:_all,可以代表搜索所有index下的指定type的數據;

  • 列出每個 Index 所包含的 Type:
GET 索引名稱/_mapping
  • 分頁搜索的語法size:

GET /_search?size=10

GET /_search?size=10&from=0

GET /_search?size=10&from=20

四、返回內容:

格式如下:

{
  "took": 80,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "failed": 0
  },
  "hits": {
    "total": 19,
    "max_score": 1,
    "hits": [
      {
        "_index": "order_dept",
        "_type": "order_dept_hour",
        "_id": "007",
        "_score": 1,
        "_source": {
          "id": "20250816027R0030",
          "dept_code": "020",
          "order_date": "2025-08-27",
          "order_num": 520,
          "hour": "14"
        }
      }
	  
	  
}

具體的解釋如下:

took字段表示該操作的耗時(單位為毫秒),timed_out字段表示是否超時,

hits字段表示命中的記錄,里面子字段的含義如下。

    * total:返回記錄數,本例是2條。
	
    * max_score:最高的匹配程度,本例是1.0。
	
    * hits:返回的記錄組成的數組。
	
	* _score字段,表示匹配的程度,分值越高就代表越匹配。
	
	* _source: 表示字段。

參考資料:

http://blog.itpub.net/29715045/viewspace-2653369/

https://blog.csdn.net/qq_29580525/article/details/80908523

https://www.cnblogs.com/ghj1976/p/5293250.html

http://doc.codingdict.com/elasticsearch/0/

https://www.zhihu.com/question/323811022


免責聲明!

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



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