ElasticSearch 基本語法


Elasticsearch也是基於Lucene的全文檢索庫,本質也是存儲數據,很多概念與MySQL類似的。

對比關系:

索引(indices)--------------------------------Databases 數據庫

類型(type)-----------------------------Table 數據表

    文檔(Document)----------------Row 行

  字段(Field)-------------------Columns 列

 

| 概念                 | 說明                                                         |
| -------------------- | ------------------------------------------------------------ |
| 索引庫(indices)     | indices是index的復數,代表許多的索引,                       |
| 類型(type)         | 類型是模擬mysql中的table概念,一個索引庫下可以有不同類型的索引,比如商品索引,訂單索引,其數據格式不同。不過這會導致索引庫混亂,因此未來版本中會移除這個概念 |
| 文檔(document)     | 存入索引庫原始的數據。比如每一條商品信息,就是一個文檔       |
| 字段(field)        | 文檔中的屬性                                                 |
| 映射配置(mappings) | 字段的數據類型、屬性、是否索引、是否存儲等特性               |



是不是與Lucene和solr中的概念類似。

另外,在SolrCloud中,有一些集群相關的概念,在Elasticsearch也有類似的:

- 索引集(Indices,index的復數):邏輯上的完整索引 collection1 
- 分片(shard):數據拆分后的各個部分
- 副本(replica):每個分片的復制



要注意的是:Elasticsearch本身就是分布式的,因此即便你只有一個節點,Elasticsearch默認也會對你的數據進行分片和副本操作,當你向集群添加新數據時,數據也會在新加入的節點中進行平衡。

Elasticsearch采用Rest風格API,因此其API就是一次http請求,你可以用任何工具發起http請求

創建索引 

創建索引的請求格式:

- 請求方式:PUT

- 請求路徑:/索引庫名

- 請求參數:json格式:

  
  {
      "settings": {
          "number_of_shards": 3,
          "number_of_replicas": 2
        }
  }
  

  - settings:索引庫的設置
    - number_of_shards:分片數量
    - number_of_replicas:副本數量

查看索引 

GET /索引庫名

 

可以使用*來查詢所有索引庫配置

 

刪除索引 

DELETE /索引庫名

可以用HEAD請求,查看索引是否存在:

 

配置映射 

 

索引有了,接下來肯定是添加數據。但是,在添加數據之前必須定義映射。

什么是映射?

映射是定義文檔的過程,文檔包含哪些字段,這些字段是否保存,是否索引,是否分詞等

只有配置清楚,Elasticsearch才會幫我們進行索引庫的創建(不一定)

 

創建映射字段

PUT /索引庫名/_mapping/類型名稱
{
  "properties": {
    "字段名": {
      "type": "類型",
      "index": true"store": true"analyzer": "分詞器"
    }
  }
}
  • 類型名稱:就是前面將的type的概念,類似於數據庫中的不同表 字段名:任意填寫 ,可以指定許多屬性,例如:

  • type:類型,可以是text、long、short、date、integer、object等

  • index:是否索引,默認為true

  • store:是否存儲,默認為false

  • analyzer:分詞器,這里的ik_max_word即使用ik分詞器

 示例

PUT test/_mapping/goods
{
  "properties": {
    "title": {
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "images": {
      "type": "keyword",
      "index": "false"
    },
    "price": {
      "type": "float"
    }
  }
}

響應結果 

{
  "acknowledged": true
}

查看映射關系

GET /索引庫名/_mapping

 

示例 

GET /test/_mapping

響應
{
"heima": { "mappings": { "goods": { "properties": { "images": { "type": "keyword", "index": false }, "price": { "type": "float" }, "title": { "type": "text", "analyzer": "ik_max_word" } } } } } }

字段屬性詳解

type

  

 

 

 

  • String類型,又分兩種:

    • text:可分詞,不可參與聚合

    • keyword:不可分詞,數據會作為完整字段進行匹配,可以參與聚合

  • Numerical:數值類型,分兩類

    • 基本數據類型:long、interger、short、byte、double、float、half_float

    • 浮點數的高精度類型:scaled_float

      • 需要指定一個精度因子,比如10或100。elasticsearch會把真實值乘以這個因子后存儲,取出時再還原。

  • Date:日期類型

    elasticsearch可以對日期格式化為字符串存儲,但是建議我們存儲為毫秒值,存儲為long,節省空間。

index

    

index影響字段的索引情況。

  • true:字段會被索引,則可以用來進行搜索。默認值就是true

  • false:字段不會被索引,不能用來搜索

index的默認值就是true,也就是說你不進行任何配置,所有字段都會被索引。

但是有些字段是我們不希望被索引的,比如商品的圖片信息,就需要手動設置index為false。

 

store

是否將數據進行額外存儲。

在學習lucene和solr時,我們知道如果一個字段的store設置為false,那么在文檔列表中就不會有這個字段的值,用戶的搜索結果中不會顯示出來。

但是在Elasticsearch中,即便store設置為false,也可以搜索到結果。

原因是Elasticsearch在創建文檔索引時,會將文檔中的原始數據備份,保存到一個叫做_source的屬性中。而且我們可以通過過濾_source來選擇哪些要顯示,哪些不顯示。

而如果設置store為true,就會在_source以外額外存儲一份數據,多余,因此一般我們都會將store設置為false,事實上,store的默認值就是false。

 

boost

激勵因子,這個與lucene中一樣

 

 

 

新增數據

   隨機生成id

  通過POST請求,可以向一個已經存在的索引庫中添加數據。

POST /索引庫名/類型名
{
    "key":"value"
}

 示例 

POST /test/goods/
{
    "title":"錘子手機",
    "images":"http://image.test.com/12479122.jpg",
    "price":2699.00
}
響應 
{
"_index": "test", "_type": "goods", "_id": "r9c1KGMBIhaxtY5rlRKv", "_version": 1, "result": "created", "_shards": { "total": 3, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 2 }

  查看數據 

get _search
{
    "query":{
        "match_all":{}
    }
}
{
  "_index": "heima",
  "_type": "goods",
  "_id": "r9c1KGMBIhaxtY5rlRKv",
  "_version": 1,
  "_score": 1,
  "_source": {
    "title": "錘子手機",
    "images": "http://image.test.com/12479122.jpg",
    "price": 2699
  }
}
  • _source:源文檔信息,所有的數據都在里面。

  • _id:這條文檔的唯一標示,與文檔自己的id字段沒有關聯

自定義id

 

POST /索引庫名/類型/id值
{
    ...
}

示例 

POST /test/goods/2
{
    "title":"華為手機",
    "images":"http://image.test.com/12479122.jpg",
    "price":2899.00
}

智能判斷

Solr中,在新增數據時,只能使用提前配置好映射屬性的字段,否則就會報錯。

不過在Elasticsearch中並沒有這樣的規定。

事實上Elasticsearch非常智能,你不需要給索引庫設置任何mapping映射,它也可以根據你輸入的數據來判斷類型,動態添加數據映射。

 

POST /test/goods/3
{
    "title":"超米手機",
    "images":"http://image.test.com/12479122.jpg",
    "price":2899.00,
    "stock": 200,  //新增的未配置映射的字段
    "saleable":true //新增的未配置映射的字段
 }

 

修改數據

請求方式改為PUT,就是修改了。不過修改必須指定id,

  • id對應文檔存在,則修改

  • id對應文檔不存在,則新增

PUT /test/goods/3
{
    "title":"蘋果手機",
    "images":"http://image.test.com/12479122.jpg",
    "price":3899.00,
    "stock": 100,
    "saleable":true
}

刪除數據

刪除使用DELETE請求,同樣,需要根據id進行刪除

DELETE /索引庫名/類型名/id值

 


免責聲明!

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



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